Это законно в 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()?
Первый - это явная специализация (это нормально); вторая - частичная специализация (а это не так). –