【问题标题】:Template class copy constructor parameter with or without template argument?带有或不带有模板参数的模板类复制构造函数参数?
【发布时间】:2015-08-04 10:52:43
【问题描述】:

你好,下面两个是等价的:

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 withwithout 模板参数列表?如果我不写模板参数是否意味着其他版本(具有不同的模板参数)可以传递给复制构造函数?

因此,如果我想通过模板参数从类 A 中实现这一点,例如:int,它的复制构造函数只接受 A使用 same 模板参数(在我们的示例中:int),我是否必须将模板参数()放在那里?

【问题讨论】:

  • 你展示的两个是等价的。
  • Here 你可以看到它们是一样的。
  • @NathanOliver 只是为了确认:来自您链接的 example。你的意思是:因此这两个规范 - 有和没有&lt;T&gt; - 是(被视为)相同的,它们不能被覆盖,对吧?否则——如果它们实际上不一样——它们可能已经超载。我理解正确吗?谢谢
  • @GabrielePompa 是的。它们是一样的,所以如果你同时使用它们,你会得到一个编译器错误。

标签: c++ templates methods constructor


【解决方案1】:

我是否必须在复制构造函数中编写带有或不带有模板参数列表的类名?

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

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

不,没有参数它专门表示name&lt;T&gt;。要允许从其他专业转换,您需要一个构造函数模板:

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

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

因此,如果我想实现 [...] 它只接受具有相同模板参数的 A [...],我是否必须将模板参数 () 放在那里?

不,在这种情况下你有什么是好的。

【讨论】:

  • 这有帮助,谢谢。你能提供一些参考吗?
【解决方案2】:

在模板定义中,namename&lt;T&gt; 的简写 (见§14.6.1)

【讨论】:

    猜你喜欢
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    相关资源
    最近更新 更多