Ошибка компилятора C++ при специализации шаблона
Я хотел бы специализировать шаблонный метод для класса C, который сам шаблонизируется параметром int.
Как мне это сделать?
template <int D=1>
class C {
static std::string foo () { stringstream ss; ss << D << endl; return ss.str();}
};
template <class X>
void test() { cout << "This is a test" << endl;}
template <>
template <int D>
void test<C<D> > () {cout << C<D>::foo() << endl;}
Специализация для test() завершается с ошибкой "Слишком много списков параметров шаблона в объявлении void test()".
2 ответа
Решение
Частичная специализация шаблона функции не допускается. Делать
template <int D>
void test () {cout << C<D>::foo() << endl;}
Ты не хочешь первого template<>
на вашей частичной специализации test<C<D>>
, Более того, вы можете только частично специализировать шаблоны классов, а не шаблоны функций. Нечто подобное может работать:
template <class X>
struct thing
{
static void test() { cout << "This is a test" << endl;}
};
template <int D>
struct thing<C<D>>
{
static void test() {cout << C<D>::foo() << endl;}
};
Если ваш шаблон функции взял аргумент и использовал его для вывода аргумента шаблона, то вы можете получить аналогичный эффект, используя перегрузку, что-то вроде:
template <class X>
void test(const X&) { cout << "This is a test" << endl;}
template <int D>
void test(const C<D>&) {cout << C<D>::foo() << endl;}
test(3); // calls first version
test(C<3>()); // calls second version