C++ 专门化模板类的函数

C++ 专门化模板类的函数,c++,templates,specialization,C++,Templates,Specialization,这在C++中是合法的: template <int N> class A { void bar() {std::cout << N << '\n';} }; template<> void A<2>::bar() {std::cout << "Two\n";} // This is ok. 模板类别A{ void bar(){std::cout您试图实现的称为部分模板专门化,只允许用于类,不允许用于函数。例如,

这在C++中是合法的:

template <int N> class A {
    void bar() {std::cout << N << '\n';}
};

template<>
void A<2>::bar() {std::cout << "Two\n";}  // This is ok.
模板类别A{

void bar(){std::cout您试图实现的称为部分模板专门化,只允许用于类,不允许用于函数。例如,请参见

第一个是显式专门化(可以);第二个是部分专门化(不可以)。我知道这条规则,但我认为这里的部分专门化更多地与类有关,而不是与函数有关。毕竟,错误消息指向
B
是一个不完整的类型。因此没有令人满意的解决方法,是吗?该链接与此问题无关-OP并没有尝试部分专门化函数模板但是人们都投票认为我是。我还以为在发布问题之前,我并没有试图对函数模板进行部分专门化。
template <int...> struct B;

template <int First, int... Rest>
struct B<First, Rest...> : B<Rest...> {
    static void foo() {
        std::cout << First << ' ';
        B<Rest...>::foo();  
    }
    static void bar() {/*Bunch of code*/}
    static void baz() {/*Bunch of code*/}
};

template <>
struct B<> {
    static void foo() {}
    static void bar() {}
    static void baz() {}
};
template <int... Rest>
void B<2, Rest...>::foo() {  // Illegal.
    std::cout << "Two ";
    B<Rest...>::foo();
}
template <int... Rest>
struct B<2, Rest...> : B<Rest...> {
    static void foo() {
        std::cout << "Two ";
        B<Rest...>::foo();  
    }
    static void bar() {/*Same bunch of code as above*/}
    static void baz() {/*Same bunch of code as above*/}
};