在下面的代码中,我收到了编译错误
#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 :(得分:1)
类模板的成员函数本身也是函数模板。这意味着您可以明确地对它们进行专门化(就像在第二个示例中那样),但是功能模板不能部分专门化(正如您在第一个示例中所尝试的那样)。
作为一种解决方法,您可以部分地专门化整个班级:
template <typename T>
class MyClass<T, 1>
{
public:
void func1() { cout << "special: func1" << endl; };
// ...
};
您可能需要重构代码以将公共代码放入基类中以使此方法可维护。