我读到模板copy-con永远不是默认的onstructor,而模板赋值操作永远不是复制赋值操作符。
我无法理解为什么需要这个限制并立即上线到ideone并返回test program但是这里复制构造函数永远不会被调用进一步的谷歌搜索我遇到了模板化的构造函数并尝试了但仍然它永远不会调用复制构造函数。
#include <iostream>
using namespace std;
template <typename T> class tt
{
public :
tt()
{
std::cout << std::endl << " CONSTRUCTOR" << std::endl;
}
template <typename U> const tt<T>& operator=(const tt<U>& that){std::cout << std::endl << " OPERATOR" << std::endl;}
template <typename U> tt(const tt<U>& that)
{
std::cout << std::endl << " COPY CONSTRUCTOR" << std::endl;
}
};
tt<int> test(void)
{
std::cout << std::endl << " INSIDE " << std::endl; tt<int> a; return a;
}
int main() {
// your code goes here
tt<int> a ; a = test();
return 0;
}
有人能解释一下这个限制背后的全部原因,以及如何编写模板类的复制构造函数。
由于
答案 0 :(得分:22)
有什么构成复制构造函数的严格规则(参见C ++ 11,12.8):
这不是模板。
对于课程T
,其第一个参数必须为T &
或T const &
或T volatile &
或T const volatile &
。
如果它有多个参数,则其他参数必须具有默认值。
如果您未声明复制构造函数,则T::T(T const &)
形式的复制构造函数将为您隐式声明 。 (它可能实际上也可能没有实际定义,如果定义它可能被定义为删除。)
(通常的重载决策规则意味着您最多可以拥有四个复制构造函数,每个复制构造函数一个。)
移动构造函数有类似的规则,&&
代替&
。
答案 1 :(得分:21)
我无法评论为什么会这样,但是这里是你为类模板编写复制构造函数和赋值运算符的方法:
template <class T>
class A
{
public:
A(const A &){}
A & operator=(const A& a){return *this;}
};
就是这样。
这里的诀窍是即使A
是一个模板,当你在类中引用它A
时(例如在函数签名中)它被视为完整类型A<T>