根据cppreference,副本分配运算符应不使用模板:
类T的副本分配运算符是名称为operator =的非模板非静态成员函数,该函数正好采用类型T,T&,const T&,volatile T&或const volatile T&“
但是在这个示例程序中,我编写了一个模板化赋值运算符,没有编译问题,并且实际上被调用(并且不是默认隐式生成的)。
template<typename T1>
class Sample
{
public:
T1 a;
Sample(T1 b)
{
a=b;
}
template<typename T2>
void operator = (T2& obj2)
{
cout<<"This wont be called";
(*this).a=obj2.a;
}
};
Sample<int> obj1(2);
Sample<int> obj2(3);
obj2=obj1;
输出:
This wont be called
我误会了吗?
答案 0 :(得分:1)
template<typename T2>
void operator=(T2& obj2) { ... }
定义了operator=
函数,但根据标准,它不是复制分配运算符。要成为副本分配操作员,必须具备以下条件:
void operator=(Samble& obj2) { ... }
或更佳
Sample& operator=(Sample const& obj2) { ... }
给出您的代码,您可以使用:
Sample<int> a;
Samble<double> b;
b = a;
如果您拥有真正的副本分配运算符,则它将无法编译。
答案 1 :(得分:1)
template<typename T2> void operator = (T2&)
不是复制分配运算符。
因此会生成默认的void operator = (const Sample&)
。
但您更适合:
Sample<int> obj1(2);
Sample<int> obj2(3);
obj2 = obj1;
但是
const Sample<int> obj1(2);
Sample<int> obj2(3);
obj2 = obj1;
您将获得预期的结果: