将该运算符放在您的类定义中。它必须是一个成员,因为它operator=
很特别,无论如何你都不会通过将它写成非成员来获得什么。非会员运营商有两个重要的主要好处:
- 运算符调用右侧和左侧的隐式转换
- 无需了解班级的内部情况。功能可以实现为非会员非好友。
对于operator=
,两者都不可用。分配给转换的临时结果没有意义,并且operator=
在大多数情况下需要访问内部。此外,operator=
如果您不提供,C++ 会自动提供一个特殊的(所谓的复制赋值运算符)。使operator=
作为非成员重载成为可能会引入额外的复杂性,而显然没有实际收益,因此这是不允许的。
因此,更改您的代码,使其看起来像这样(这假设operator=
不是复制赋值运算符,而是从 a 分配给list<T>
其他东西。这从您的问题中不清楚):
class MyClass {
...
template<class T>
MyClass& operator=(const list<T>& lst)
{
clear();
copy(lst);
return *this;
}
...
};
operator=
a 再次返回对自身的引用是非常标准的。我建议你坚持这种做法。它对程序员来说看起来很熟悉,如果它void
突然返回,可能会引起意外。