2015-05-31 35 views
3

这在C法律++:专业模板类的功能

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

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

现在考虑这个类:

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(); 
} 

我不明白为什么B<2, Rest...>是一个不完整的类型,如错误消息所述。显然,实现我想要的唯一方法就是通过这个?

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*/} 
}; 

因此重复bar()和baz()中的所有代码?

+2

第一种是明确的特化(这是确定的);第二个是部分专业化(不是)。 –

回答

0

你试图实现的是称为局部模板专门化,并且只允许用于类,而不是函数。例如参见Why function template cannot be partially specialized?

+0

我知道这个规则,但我认为这里的部分专业化更多的是与课堂相比,而不是功能。毕竟,错误信息指向'B <2, Rest...>'是一个不完整的类型。所以没有令人满意的解决方法,是吗? – prestokeys

+1

该链接与此问题无关--OP并未尝试部分专门化功能模板。 – Barry

+0

但是人们投票认为我是。我还以为我没有试图在发布我的问题之前部分专门化功能模板。 – prestokeys