2012-03-02 13 views
4

なぜ以下はコンパイルされませんか?テンプレート化された親からの子のtypedefへのアクセス

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の代わりに静的関数を使って同じことを試みましたが、うまくいきました。

私はGCC 4.4.2とclang 3.0の両方を試しました。

+0

[C++静的多型(CRTP)と派生クラスのtypedefを使用する可能性のある複製](http://stackoverflow.com/questions/6006614/c-static-polymorphism-crtp-and-using-typedefs-from-derived -クラス) – thirtythreeforty

答えて

1

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

単純なものから非常に複雑なものまでさまざまです。おそらく最も簡単な方法は、あなたがそれを行うことができれば、あなたが実際にそれを必要とするまで(遅延評価、本質的に)Child :: Typeでの作業を避けることです。あなたが達成したいことを正確に述べれば、それは役に立ちます。 completementで

1

はあなたbaseのタイプを持つに依存している場合、その後、あなたはそれがあたかもきれいではありません

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

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

よりも多くの悪いこと行うことができ、答えをstinky472します。

関連する問題