为什么使用X而不是X <t>来模板化构造函数和析构函数?</t>

时间:2014-06-29 19:37:35

标签: c++ templates

在Professional C ++(2e页689)中,它说:

  

只有构造函数和析构函数才能使用X而不是X<T>   template<typename T> class X{ X(); // X ~X(); // X X<T>& operator=(const X<T>& rhs); // X<T> };

所以:

X<T>

为什么不将{{1}}用于构造函数和析构函数声明?

2 个答案:

答案 0 :(得分:4)

引用很简单,错误

X<T>是该类型的实际名称:

  

[C++11: 14.2/6]:用于命名类模板特化的 simple-template-id class-name (第9条)。

......你可以在任何地方使用它:

template<typename T>
class X
{
public:
    X<T>() {}
    ~X<T>() {}
    X<T>& operator=(const X<T>& rhs) {}
};

int main()
{
    X<int> x;
}

live demo

您可以选择使用X作为&#34;简写&#34;,从而为您自动附加模板参数(有点):

  

[C++11: 14.6.1/1]: 与普通(非模板)类一样,类模板有注入类名(第9条)。 inject-class-name 可以用作模板名称类型名称当它与 template-argument-list ,作为模板 template-parameter template-argument ,或作为中的最终标识符友元类模板声明的elaborated-type-specifier ,它指的是类模板本身。 否则,它等同于 template-name ,后跟<>中包含的类模板的 template-parameters < / p>

......但它肯定不是必需的

听起来好像作者正试图强制执行风格指南,但已经明确表示完全取决于你。

答案 1 :(得分:-1)

这里与X无关,它只是一个类名。

由于构造函数和析构函数与类具有相同的名称,并且两者都没有返回类型,因此无需指定它。