Запутанное наследование и шаблоны - PullRequest
1 голос
/ 22 декабря 2011

Вот код, который я искал, Исходный код :

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

, если мы создадим его с помощью некоторого функтора X, то есть function_traits<X>;, который создаст базовый классfunction_traits<decltype(&X::operator())> из-за наследования, но для построения function_traits<decltype(&X::operator())> его база также должна быть построена, что может быть function_traits<decltype(Z)>

Я понимаю function_traits<X>! = function_traits<Z>.Разве это не рекурсивное наследование?0_о.Как все вещи работают вместе?

1 Ответ

2 голосов
/ 22 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...