1

+= 演算子を追加するために構造体を継承しようとしています。

このコードは正しいように見えますが、コンパイルに失敗し、コンパイラから得られるのは次のとおりです。

構文エラー: '<' の前に ',' がありません
コンパイル中のクラス テンプレートのインスタンス化 '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>
{
    //...
};
4

2 に答える 2