2015-05-31 6 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