2017-11-17 9 views
2

私は以下のコードに私がいる問題を再現しました:問題は、私はAがT::typeの戻り値の型を持つ関数を持っていますが、Bが完全ではないので、持っている必要があるということですファンクション(CRTP)の戻り値の型としてテンプレートパラメータタイプを使用しますか?

template<typename T> 
class A{ 
    using type = T::type; 
    type someFunction(/*some parameters*/){/*code for the function*/} 
    //other stuff 
}; 

template<typename T> 
class B : public A<B<T>>{ 
    typedef T type; 
    //other stuff 
}; 

Aがコンパイルされたときに宣言したとき、コンパイルしようとするとエラーinvalid use of incomplete type ‘class B<int>’が返されます(intは他の型に置き換えられます)。これを動作させる方法はありますか?

答えて

3

あなたは外部の特性クラスにB<T>::typeの定義を移動する場合は、それを達成することができます

template <typename T> 
struct Traits { /* maybe some default values */ }; 

template<typename T> 
class A{ 
    using type = typename Traits<T>::type; 
    type someFunction(/*some parameters*/){/*code for the function*/} 
    //other stuff 
}; 

template<typename T> 
class B : public A<B<T>>{ 
    using type = typename Traits<B<T>>::type; 
}; 

template <typename T> 
struct Traits<B<T>> { 
    using type = T; 
}; 
1

は、この作業を取得する方法はありますか?

あなたが代わりに使用しての種類を導出する特性クラスを使用することができます。

using type = T::type; 

例:

// Declare TypeSelector 
template <typename T> struct TypeSelector; 

template <typename T> 
class A 
{ 
    using type = typename TypeSelector<T>::type; 
    type someFunction(/*some parameters*/){ return type {}; } 
}; 

// Declare B. 
template <typename T> class B; 

// Define TypeSelector for <B<T>> first before defining B<T> 
template <typename T> struct TypeSelector<B<T>> 
{ 
    using type = T; 
}; 

template<typename T> 
class B : public A<B<T>>{ 
    using type = typename TypeSelector<T>::type; 
    //other stuff 
}; 

int main() 
{ 
    // Compiles fine. 
    B<int> a; 
} 
関連する問題