嗨,以下两个是等价的:
template<class T>
class name {
public:
name() {/*...*/}
name(name const &o) {/*...*/} // WITHOUT TEMPLATE ARGUMENT
/*...*/
};
template<class T>
class name {
public:
name() {/*...*/}
name(name<T> const &o) {/*...*/} // WITH TEMPLATE ARGUMENT SPECIFIED
/*...*/
};
所以我的问题是:我是否必须在复制构造函数中使用或编写 classname 而不使用模板参数列表?如果我不写模板参数是否意味着其他版本(具有不同的模板参数)可以传递给复制构造函数?
因此,如果我想通过模板参数从 A 类中获取它,例如: int ,它的复制构造函数只接受 A 使用相同的模板参数(在我们的示例中: int ),我是否必须将模板参数(&lt; T,K,...&gt;)放在那里?
答案 0 :(得分:1)
我是否必须在复制构造函数中使用或不使用模板参数列表编写classname?
它们是等价的。在模板的范围内,name
是注入的类名,表示类name<T>
。如果指定模板参数,它也可以用作模板名称。
如果我不编写模板参数,是否意味着其他版本(具有不同的模板参数)可以传递给复制构造函数?
不,没有参数,它具体表示name<T>
。要允许从其他专业化转换,您需要一个构造函数模板:
template <typename T2> name(name<T2> const & other);
请注意,这不会作为复制构造函数:如果您不想要隐式生成的那个,则需要单独声明它。
所以,如果我想要实现它只接受具有相同模板参数的A [...],我是否必须放置模板参数(&lt; T,K,...&gt;那里?
不,在这种情况下,你所拥有的一切都很好。
答案 1 :(得分:0)
在模板定义中,name
是name<T>
的简写
(见§14.6.1)