4

以下がコンパイルされないのはなぜですか?

template <typename Child> struct Base
{
    typename Child::Type t; // Does not compile. "No type named Type in Child"
};

struct Derived : public Base<Derived>
{
    typedef int Type;
};

どうしてBaseその子のタイプにアクセスできないのですか?typedefの代わりに静的関数で同じことを試しましたが、それは問題なく機能します。

GCC4.4.2とclang3.0の両方を試しました。

4

2 に答える 2

1

Base がインスタンス化された時点では Derived はまだ完全に定義されていないため、この種のコードは機能しません。基本的に不完全型になります。

代替手段は、単純なものから非常に複雑なものまでさまざまです。おそらく最も簡単な方法は、可能であれば、実際に必要になるまで Child::Type を使用しないことです (本質的に遅延評価)。達成したいことを正確に述べていただけると助かります。

于 2012-03-02T22:50:31.607 に答える
1

stinky472 の回答の補足として、baseType を持つことに依存している場合は、より悪い結果になる可能性があります。

template<typename Child, typename Type>
struct base
{
     Type t;
};

   struct Derived : public Base<Derived, int>
{
};

とはいえ、それほどきれいではありません。

于 2012-03-02T22:55:10.030 に答える