0

同じテンプレート タイプの 2 つのテンプレート A と B があります。A は常に B から継承しますが、A 自体が使用するのと同じテンプレートを常に B に選択します。

これ自体は問題ありませんが、テンプレート タイプを 2 回記述する必要があります。サブクラスから継承するときに、Aの型を何らかの形でtypedefし、ジェネリックなtypedef名を参照することは可能ですか?

以下は、コンパイルされないコードの例ですが、私が何をしたいのか明確なアイデアを与えるはずです:

// #1
template <typename T>
struct A
{
    typename T type;
    // class details here
};

// #2
template <typename T>
struct B
{
    // class details here
};

// #3
template <>
struct A<int>
    : B<type> // Compiler complains here (type not defined)
    //: B<A::type> // Compiler complains here (type not defined)
    // I could write ": B<int>" instead, but this is repitition I want to avoid
{
    // class specialization details here
};

私は代替ソリューションを受け入れています。これが私にとって重要な理由は、#3 のような大量のコードのリストがあり、(バグを避けるために) 重複を減らしたいからです。

4

1 に答える 1

1

同じテンプレートの 2 つの異なる特殊化は、まったく無関係な型*A<>::typeであるため、特殊化内のベース テンプレートから使用することはできませんA<int>type特殊化の中で定義してもA<int>、クラスが定義されるまで利用できません。これは、継承のリストの後で発生します。

あなたはそこで使用することができ、使用する必要: B<int>があります。これは と同じ繰り返しであり、 がから継承されB<type>ていることを明確にします。A<int>B<int>

あなたのデザインから私を悩ませているもう1つのことは、A<>(一般的なもの)は とは何の関係もありませんが、B<>からA<int>継承していB<int>ます。言語は特殊化で完全に無関係な動作を可能にしますが、他のプログラマーは、一部の を取得しA<T>て関数にのオブジェクトを渡すことができ、他のものを取得できない場合、驚くかもしれません...B<T>T

あなたが解決したい本当の問題は何ですか?


*これは、特殊化が特別な動作 (つまり、ベースと異なるビットのみ)を提供するのではなく、そのタイプのすべての動作を提供することを意味します。動作の一部のみをオーバーライドすることを意図している場合は、実装を借用できるように (または他の特殊化)A<T>ベースにリファクタリング (ジェネリック) するなど、他の代替手段を検討する必要があります。A<int>または、動作の変更が小さい場合は、メンバー関数の一部を特殊化できる可能性があります...

于 2013-08-13T20:04:11.590 に答える