частично указанный класс шаблона с нетиповым параметром в переполнении стека

В следующем коде я получил ошибку компиляции

#include <iostream>

using namespace std;

template <typename T, int I>
class MyClass {
public:
void func1(){
cout<<"default: func1"<<endl;
}
void func2(){
cout<<"default: func2"<<endl;
}
private:
T haha;
};

template <typename T>
void MyClass<T, 1>::func1(){
cout<<"special: func1"<<endl;
};int main()
{
MyClass<int, 2> intclass;
intclass.func1();
intclass.func2();

MyClass<double, 1> doubleclass;
doubleclass.func1();
doubleclass.func2();
return 0;
}

Я получил следующую ошибку компиляции:

partialspecifizednontype.cpp:19: error: invalid use of incomplete type 'class MyClass<T, 1>'
partialspecifizednontype.cpp:6: error: declaration of 'class MyClass<T, 1>'

Есть какая-то конкретная причина, по которой я не могу этого сделать? Есть ли способ обойти это?

Я замечаю, что если в моем шаблонном классе нет первого параметра, все в порядке. (мой gcc 4.2.1)

Следующий пример в порядке:

#include <iostream>

using namespace std;

template <int I>
class MyClass {
public:
void func1(){
cout<<"default: func1"<<endl;
}
void func2(){
cout<<"default: func2"<<endl;
}
};

template<>
void MyClass<1>::func1(){
cout<<"special: func1"<<endl;
};int main()
{
MyClass<2> intclass;
intclass.func1();
intclass.func2();

MyClass<1> doubleclass;
doubleclass.func1();
doubleclass.func2();
return 0;
}

0

Решение

Функции-члены шаблонов классов также являются самостоятельными шаблонами функций. Это означает, что вы можете специализировать их явно (как вы делаете во втором примере), но шаблоны функций не могут быть частично специализированы (как вы пытаетесь в первом примере).

В качестве обходного пути вы можете частично специализировать весь класс:

template <typename T>
class MyClass<T, 1>
{
public:
void func1() { cout << "special: func1" << endl; };
// ...
};

Возможно, вам придется реорганизовать ваш код, чтобы поместить общий код в базовый класс, чтобы сделать этот подход понятным.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]