模板类专业化的模板方法

ant*_*r89 10 c++ linux templates g++

这是我的代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

它运作良好.但是当我尝试添加这个

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;
}
Run Code Online (Sandbox Code Playgroud)

我得到compiller错误:«>»令牌模板-id«DoSomething <0>»for«int MyClass :: DoSomething()»与任何模板声明都不匹配之前的显式专门化无效

我用g ++ 4.6.1我该怎么办?

Mik*_*our 8

不幸的是,您无法专门化作为类模板成员的模板,而无需专门设计外部模板:

C++ 11 14.7.3/16:在类模板成员或出现在命名空间范围内的成员模板的显式特化声明中,成员模板及其某些封闭类模板可能保持非专业化,但声明除外如果类成员模板的封闭类模板也没有明确专门化,则不应明确地专门化它.

我认为你最好的选择是添加额外的参数MyClass,然后部分专门化.

  • @AlanStokes:"类成员模板"表示一个类的成员模板 - 它可以是函数或嵌套类的模板."成员类模板"将特别指代一个成员的类模板(根据14.7.3/1中的该术语使用).GCC至少使用了这种解释. (2认同)