その演算子をクラス定義内に入れます。operator=
それは特別であり、とにかく非会員としてそれを書いても何かを得ることはないので、それは会員でなければなりません. 非会員オペレーターには、2 つの重要な主な利点があります。
- 演算子呼び出しの右側と左側の暗黙的な変換
- クラスの内部について知る必要はありません。機能は非会員非友人として実現できます。
の場合operator=
、どちらも使えません。変換の一時的な結果に割り当てることは意味がなくoperator=
、ほとんどの場合、内部にアクセスする必要があります。さらに、特別なoperator=
ものを指定しない場合は、C++ によって自動的に特別なものが提供されます (いわゆるコピー代入演算子)。operator=
非メンバーとしてオーバーロードできるようにすると、明らかに実用的な利益が得られないため、追加の複雑さが導入されるため、許可されていません。
したがって、コードを次のように変更します (これは、がコピー代入演算子でoperator=
はなくlist<T>
、aから別のものに代入することを前提としています。これはあなたの質問からは明らかではありません):
class MyClass {
...
template<class T>
MyClass& operator=(const list<T>& lst)
{
clear();
copy(lst);
return *this;
}
...
};
operator=
aが再び自身への参照を返すのはかなり標準的です。その慣習に従うことをお勧めします。void
プログラマーには見慣れたもので、突然戻ってきたら驚くかもしれません。