Это недопустимый код. Вы не можете наследовать от неполного типа, и в тот момент, когда вы пытаетесь извлечь из 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
, из которого вы пытаетесь получить, - полный тип. Вы можете сделать это, используя специализацию:
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.
Здесь X<A>
завершается, когда вы пытаетесь извлечь из него, так что вы в порядке.