在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}}用于构造函数和析构函数声明?
答案 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;
}
您可以选择使用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无关,它只是一个类名。
由于构造函数和析构函数与类具有相同的名称,并且两者都没有返回类型,因此无需指定它。