私が行ったばかりのテストまで、C++ではコンストラクターだけが継承されていないと信じていました。しかし、どうやら、割り当てoperator=
もそうではありません...
- その理由は何ですか?
- 代入演算子を継承するための回避策はありますか?
operator+=
、、operator-=
...の場合も同様ですか?- 他のすべての関数(コンストラクター/演算子=を除く)は継承されますか?
実際、CRTPを実行しているときに、この問題が発生しました。
template<class Crtp> class Base
{
inline Crtp& operator=(const Base<Crtp>& rhs) {/*SOMETHING*/; return static_cast<Crtp&>(*this);}
};
class Derived1 : public Base<Derived1>
{
};
class Derived2 : public Base<Derived2>
{
};
それを機能させるための解決策はありますか?
編集:OK、私は問題を切り分けました。なぜ以下が機能しないのですか?問題を解決する方法は?
#include <iostream>
#include <type_traits>
// Base class
template<template<typename, unsigned int> class CRTP, typename T, unsigned int N> class Base
{
// Cast to base
public:
inline Base<CRTP, T, N>& operator()()
{
return *this;
}
// Operator =
public:
template<typename T0, class = typename std::enable_if<std::is_convertible<T0, T>::value>::type>
inline CRTP<T, N>& operator=(const T0& rhs)
{
for (unsigned int i = 0; i < N; ++i) {
_data[i] = rhs;
}
return static_cast<CRTP<T, N>&>(*this);
}
// Data members
protected:
T _data[N];
};
// Derived class
template<typename T, unsigned int N> class Derived : public Base<Derived, T, N>
{
};
// Main
int main()
{
Derived<double, 3> x;
x() = 3; // <- This is OK
x = 3; // <- error: no match for 'operator=' in ' x=3 '
return 0;
}