+= 演算子を追加するために構造体を継承しようとしています。
このコードは正しいように見えますが、コンパイルに失敗し、コンパイラから得られるのは次のとおりです。
構文エラー: '<' の前に ',' がありません
コンパイル中のクラス テンプレートのインスタンス化 'Test' への参照を参照してください
struct plus_equals
{
template<typename T, typename S>
struct operator_type
{
S& operator+=(const T &other)
{
S* super = (S*)this;
super->value += other;
return *super;
}
};
};
template<typename T, typename OP>
struct Test : OP::operator_type<T, Test<T, OP>> // error on this line
{
T value;
Test(T val) : value(val){}
};
int main(int argc, char *argv[])
{
Test<int, plus_equals> test(123);
test += 456;
cout << test.value << endl;
return 0;
}
以下のコードがコンパイルされる理由がわかりませんが、上記のコードはコンパイルされません。
template<typename T>
struct Something
{
T GetT() { return T(); }
};
class Test : public Something<Test>
{
//...
};