一尘不染

模板类专业化的模板方法

linux

这是我的代码:

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;
}

我遇到编译器错误:«int MyClass :: DoSomething()»的«>»令牌模板标识«DoSomething
<0>»之前的无效显式专门化与任何模板声明都不匹配

我使用g ++ 4.6.1应该怎么做?


阅读 267

收藏
2020-06-07

共1个答案

一尘不染

不幸的是,如果不对外部模板进行特殊化处理,就不能对作为类模板成员的模板进行特殊处理:

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

我认为您最好的选择是将额外的参数添加到中MyClass,然后对其进行部分专业化处理。

2020-06-07