次の C++ コードはコンパイルされません。
class BaseA {
protected:
BaseA &operator = (const BaseA &rhs);
};
template<typename T>
class BaseB {
public:
T &operator = (const T &rhs) {
return *static_cast<T *>(this);
};
};
class Derived :
public BaseA,
public BaseB<Derived> {
};
int main() {
Derived foo;
Derived bar;
foo = bar;
return 0;
};
これをコンパイルしようとすると、BaseA &BaseA::operator = (const BaseA &)
未定義の苦情が表示されます。スタックオーバーフローにはこのような質問が他にもいくつかありますが、それらはすべて、Derived &Derived::operator = (const Derived &)
を呼び出す関数を自動生成するコンパイラに関係しているようですBaseA::operator = (const BaseA&)
。この場合、Derived
からその正確なシグネチャを持つ関数をすでに継承しているはずBaseB<Derived>
です。別の質問のアドバイスに従って、オーバーロードできないというコンパイラの不平を追加using BaseB<Derived>::operator =;
すると。Derived
Derived &operator = (const Derived &)
クラスがこの演算子を継承することは単に不可能ですか?
編集:明確にするために、コンパイラがすでにから継承しているのに、なぜDerived
デフォルトを与えるのか混乱しています。デフォルトのコピー代入演算子が通常作成され、継承された代入演算子をオーバーライドする理由を理解できますが、この場合、コピー代入演算子とまったく同じ署名を持つ演算子を継承しています。サブクラスがこの演算子を使用するように記述する方法はありますか?Derived &operator = (const Derived &)
T &operator (const T &) where [T = Derived]
Base<Derived>
Derived
BaseB