这是我的代码:
template<typename T1, typename T2> class MyClass { public: template<int num> static int DoSomething(); }; template<typename T1, typename T2> template<int num> int MyClass<T1, T2>::DoSomething() { cout << "This is the common method" << endl; cout << "sizeof(T1) = " << sizeof(T1) << endl; cout << "sizeof(T2) = " << sizeof(T2) << endl; return num; }
它运作良好。 但是当我尝试添加这个
template<typename T1, typename T2> template<> int MyClass<T1, T2>::DoSomething<0>() { cout << "This is ZERO!!!" << endl; cout << "sizeof(T1) = " << sizeof(T1) << endl; cout << "sizeof(T2) = " << sizeof(T2) << endl; return num; }
我得到了compiller的错误:««»标记模板ID«DoSomething <0>«int MyClass :: DoSomething()»之前的无效显式特化不匹配任何模板声明
我使用g ++ 4.6.1我应该怎么做?
不幸的是,你不能专门化一个类模板成员的模板,而没有专门化外层模板:
C ++ 11 14.7.3 / 16:在名称空间范围内出现的类模板成员或成员模板的显式特化声明中,成员模板及其某些封闭类模板可能保持未特定化, 除了声明如果它的封闭类模板没有明确地专门化,则不应该明确地专门化一个类成员模板 。
我认为你最好的选择是将额外的参数添加到MyClass
,然后部分专门化。
这是可悲的,但却是事实: 你不能明确地专门化一个类模板,除非它的封闭类模板也是明确专用的 。 欲了解更多信息,你可以阅读
下面我专门研究了MyClass,一切都完成了。
#include <iostream> using namespace std; template<typename T1, typename T2> class MyClass { public: template<int num> static int DoSomething(); }; template<typename T1, typename T2> template<int num> int MyClass<T1, T2>::DoSomething() { cout << "This is the common method" << endl; cout << "sizeof(T1) = " << sizeof(T1) << endl; cout << "sizeof(T2) = " << sizeof(T2) << endl; return num; } template<> template<> int MyClass<char, int>::DoSomething<0>() { cout << "This is ZERO!!!" << endl; cout << "sizeof(T1) = " << sizeof(char) << endl; cout << "sizeof(T2) = " << sizeof(int) << endl; return 0; } int main() { MyClass<char, int> m; m.DoSomething<2>(); m.DoSomething<0>(); return 0; }
输出:
This is the common method sizeof(T1) = 1 sizeof(T2) = 4 This is ZERO!!! sizeof(T1) = 1 sizeof(T2) = 4
找到了! 这在MSVCPP 10上运行良好。
#include <iostream> using namespace std; template<typename T1, typename T2> class MyClass { public: template<int num> static int DoSomething(); template<> static int DoSomething<0>() { cout << "This is ZERO!!!" << endl; cout << "sizeof(T1) = " << sizeof(T1) << endl; cout << "sizeof(T2) = " << sizeof(T2) << endl; return 0; } }; template<typename T1, typename T2> template<int num> int MyClass<T1, T2>::DoSomething() { cout << "This is the common method" << endl; cout << "sizeof(T1) = " << sizeof(T1) << endl; cout << "sizeof(T2) = " << sizeof(T2) << endl; return num; } int main() { MyClass<char, int> m; m.DoSomething<2>(); m.DoSomething<0>(); return 0; }
输出:
This is the common method sizeof(T1) = 1 sizeof(T2) = 4 This is ZERO!!! sizeof(T1) = 1 sizeof(T2) = 4
顺便说一句,不要return num;
从专业化。 它从来不知道是什么num
。