Ошибка компилятора C ++ при специализации шаблона - PullRequest
3 голосов
/ 18 июня 2010

Я хотел бы специализировать шаблонный метод для класса 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 ]

2 голосов
/ 18 июня 2010

Частичная специализация шаблона функции не допускается. У

template <int D>  
void test () {cout << C<D>::foo() << endl;}
1 голос
/ 18 июня 2010

Вам не нужен первый 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
...