Partial specialization failure with GCC

问题

回答完这个问题后,我决定深入研究这个问题,以找到一个具有相同错误的最小且可复制的示例。

假设我有以下主模板,我想将它专门用于std::vector如下:

#include <vector>
#include <iostream>

template<typename T, typename T::value_type v>
struct foo;

template<typename T, T v>
struct foo<std::vector<T>, v> {
    static constexpr T value = v;
};

int main() {
    std::cout << foo<std::vector<int>, 32>::value << std::endl;
    return 0;
}

GCC 7.1.0 不会使用-std=c++11-std=c++14-std=c++1z编译上面的代码,也不是实验性 GCC 8.0.0,但只能使用-std=c++11-std=c++14 。 它们产生相同的错误输出:

prog.cc:8:12: error: partial specialization 'struct foo<std::vector<T>, v>' is not more specialized than [-fpermissive]
     struct foo<std::vector<T>, v> {
            ^~~~~~~~~~~~~~~~~~~~~~
prog.cc:5:12: note: primary template 'template<class T, typename T::value_type v> struct foo'
     struct foo;
            ^~~

给出的示例适用于 GCC 6.3.0,至少适用于 GCC 4.5.4。

谁能确认这是一个编译器错误? GCC 7.1.0 是否有任何解决方法可以使我的示例正常工作?


更多相关内容:请点击查看