当前位置: 首页 > 面试题库 >

模板类专业化的模板方法

岑经纶
2023-03-14
问题内容

这是我的代码:

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应该怎么做?


问题答案:

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

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

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



 类似资料:
  • 还尝试在专门化的中进行模板方法专门化: 这一次它编译,但调用原始方法,即 解决方案

  • 关于下一个代码,我有一些问题: > 类专业化

  • 我有一个模板基类,其模板参数类型为bool。此基类的构造函数参数列表取决于模板参数是true还是false。我想从这个类派生另一个模板类,它的模板参数是任意类型的。我需要这个派生类根据该类型的特征调用该基类的正确构造函数。 下面的例子并不包罗万象。无论是否为整数,基类模板bool可以是任何类型trait。此外,传递给派生类的模板参数的类型可以是任何类型。

  • 我有一个通用算法,需要访问其模板类型的特征。有一个特征类可以专门用于提供这些特征。 在我的类中使用此算法时,我想将其与类中定义的私有类型一起使用。 然而,专门化只能发生在或全局范围内,而我的类是不可访问的。 是否有可能以某种方式专门化具有私有类型的模板,至少在可访问此类型的范围内? 也许可以将这个专门化声明为一个类?

  • 我有几个模板参数的模板结构 此结构适用于所有模板,但结果无效的情况除外。我知道,不能实现为void类型,所以我当前的解决方案是使用如下的部分专门化: 这允许执行以下操作: 有没有一种方法可以使编译而不会在C 14标准中进行部分类特化?我可以使用和类型trait组合,但我想找到是否有一种方法: > 模板类方法的特殊化部分显式 模板类方法的实例化

  • 但是指定它是,因此它不再是模板类。它是否可以像虚函数一样专门化或重写?