为什么使用X而不是X<;T>;对于模板化构造函数和析构函数? 在专业C++(2E页689)中,它表示:

为什么使用X而不是X<;T>;对于模板化构造函数和析构函数? 在专业C++(2E页689)中,它表示:,c++,templates,C++,Templates,仅对于构造函数和析构函数,您应该使用X,而不是 X 因此: 模板 X类{ X();//X ~X();//X X&运算符=(常量X&rhs);//X }; 为什么不在构造函数和析构函数声明中使用X?这里与X无关,它只是一个类名 由于构造函数和析构函数与类共享同一个名称,并且两者都没有返回类型,因此无需指定它。该引用完全错误。 X是类型的实际名称: [C++11:14.2/6]:命名类模板专门化的简单模板id是类名(第9条) …您可以在任何地方使用它: template<typename T

仅对于构造函数和析构函数,您应该使用
X
,而不是
X

因此:

模板
X类{
X();//X
~X();//X
X&运算符=(常量X&rhs);//X
};

为什么不在构造函数和析构函数声明中使用
X

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


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

该引用完全错误。

X
是类型的实际名称:

[C++11:14.2/6]:
命名类模板专门化的简单模板id是类名(第9条)

…您可以在任何地方使用它:

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

int main()
{
    X<int> x;
}
模板
X类
{
公众:
X(){}
~X(){}
X&运算符=(常数X&rhs){}
};
int main()
{
X;
}
()

您可以选择使用
X
作为“速记”,从而自动为您附加模板参数(类似于):

[C++11:14.6.1/1]:
与普通(非模板)类一样,类模板具有注入类名称(第9条)。注入的类名可用作模板名或类型名。当它与模板参数列表一起使用时,作为模板参数的模板参数,或作为友元类模板声明的详细类型说明符中的最终标识符时,它指的是类模板本身否则,它相当于模板名称后跟
中包含的类模板的模板参数

…但在任何地方都不需要


听起来作者试图强制执行一个样式指南,但没有明确说明这完全取决于您。

无论是
X
还是
X
都表示类定义中的类
X
。选择你想要的,只要它是
X
@quantdev。不是真的。在类定义中使用T来隐藏模板参数类T。我不知道C++中的专业是什么,因为在类定义中不需要t(x表示类定义中的x)。@ WeNeReasMus:“影子”是什么意思?代码> T < /代码>将在两种情况下都指完全相同的类,不是吗?@ USER415162442考虑<代码> StuttB{TyPulf int t;};模板结构D:B{D(){}~D(){}。在这里,
D()
~D()
不能写成
D()
~D()
,因为显式
T
引用了
B::T
@hvd,这是在ctor中使用
X
的参数,所以当有人隐藏
T
时,您会得到一个编译错误。引用中没有说这是必需的,看起来像是断章取义。听起来更像是一条编码指南,我同意这一点:放X看起来很奇怪,需要额外的输入。我建议使用
X
作为速记,在任何地方都可以清除很多混乱
template<typename T>
class X
{
public:
    X<T>() {}
    ~X<T>() {}
    X<T>& operator=(const X<T>& rhs) {}
};

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