带或不带模板参数的模板类复制构造函数参数?

时间:2015-05-22 12:07:17

标签: c++ templates methods constructor

嗨,以下两个是等价的:

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;)放在那里?

2 个答案:

答案 0 :(得分:1)

  

我是否必须在复制构造函数中使用或不使用模板参数列表编写classname?

它们是等价的。在模板的范围内,name注入的类名,表示类name<T>。如果指定模板参数,它也可以用作模板名称。

  

如果我不编写模板参数,是否意味着其他版本(具有不同的模板参数)可以传递给复制构造函数?

不,没有参数,它具体表示name<T>。要允许从其他专业化转换,您需要一个构造函数模板:

template <typename T2> name(name<T2> const & other);

请注意,这不会作为复制构造函数:如果您不想要隐式生成的那个,则需要单独声明它。

  

所以,如果我想要实现它只接受具有相同模板参数的A [...],我是否必须放置模板参数(&lt; T,K,...&gt;那里?

不,在这种情况下,你所拥有的一切都很好。

答案 1 :(得分:0)

在模板定义中,namename<T>的简写 (见§14.6.1)