2011-12-21 11 views
1
ここ

は、私が探していたコード、Source codeです:私たちはいくつかのファンクタXすなわちfunction_traits<X>;とそれをインスタンス化した場合混乱継承とテンプレート

template <typename T> 
struct function_traits 
    : public function_traits<decltype(&T::operator())> 
{}; 

、それは相続によるfunction_traits<decltype(&X::operator())>ある基底クラスを構築しますが、これだけにfunction_traits<decltype(&X::operator())>ビルドする必要もあります。function_traits<decltype(Z)>

私は理解していますfunction_traits<X>!= function_traits<Z>です。再帰的な継承ではありませんか? 0_o。 どのようにすべてのことが一緒に働いていますか?

+0

試してみるとどうなりますか? –

+0

私はあなたの質問が何であるか分かりません。これは、メンバー関数ポインタのための 'function_traits'の他の特殊化なしでは有効なコードではありません。 – ildjarn

+0

@FreakEnum:はい、そのコードには私が参照していた正確な特殊化が含まれています。 ; - ] – ildjarn

答えて

2

これは不正なコードです。不完全な型から派生することはできません。function_traitsから派生させようとする時点で、型が不完全です。

struct A { typedef A type; }; 
struct B { typedef A type; }; 

template <typename T> 
struct X : X<typename T::type> {}; 

X<B> test; // error: invalid use of incomplete type ‘struct X<A>’ 

あなたがから派生しようとしているfunction_traitsは完全な型である場合は、このラウンドを取得することができる唯一の方法です。あなたはそれから派生しようとすると、X<A>は完了ですので、あなたは大丈夫だ、

ここ
struct A { typedef A type; }; 
struct B { typedef A type; }; 

template <typename T> 
struct X : X<typename T::type> {}; 

template <> 
struct X<A> {}; // X<A> is now a complete type. 

X<B> test; // OK! Derives from X<A>, which is complete. 

:あなたは、この使用して特殊化を行うことができます。

+0

ここに全体がありますhttp://github.com/kennytm/utils/blob/master/traits.hppを見たい場合 –

+1

@FreakEnum:見ることができるように、彼は最初の下にあるさまざまなタイプの関数のテンプレートを特化しています彼は常に完全なクラスを持っています。私はKennyTMがあなたが持っている他の質問に答えると確信しています:-) http://stackoverflow.com/users/224671/kennytm –

+0

これは私にとって理にかなっています。ありがとうございました:) –

関連する問題