2017-12-02 18 views
1
template <class Derived> 
struct Base { 
    typedef typename Derived::T T; 
}; 

template <typename T_> 
struct Impl : public Base<Impl<T_>> { 
    typedef T_ T; 
}; 

これを初期化するとき、私は「Implを」だから、基本クラスから派生したtypenameを取得するには?

、どのように私が得ることができる型名に「T」という名前

無しタイプのエラーは、基本クラスから派生して定義されましたか?

+1

「テンプレート」と「typename」のキーワードはどこでどこに置かなければならないのですか?(https://stackoverflow.com/questions/610245/where-and-why-do-i-have -to-put-the-template-and-typename-keywords) – user0042

+0

これは 'typename 'キーワードそのものではなく、typenameの可視性に関するものです。 –

+0

私はそれが循環定義の一種だと言うでしょう、あなたはImplでTを2回定義しています、 'struct Impl:public Base {'? – nsubiron

答えて

0

完璧ではありませんが、機能する方法を見つけてください。特性クラスでは、私はそれはまだ定義されていません

typedef typename Impl<T_>::T T; 

を書くことができないため

template <class T> 
struct traits; 

template <class Derived> 
struct Base { 
    typedef typename traits<Derived>::T T; 
}; 

template <typename T_> 
struct Impl : public Base<Impl<T_>> { 
    typedef T_ T; 
}; 

template <typename T_> 
struct traits<Impl<T_>> { 
    typedef T_ T; 
}; 

は、これは完璧ではありません。