以下是我正在寻找的代码,Source code:
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_o。
所有事情是如何一起工作的?
答案 0 :(得分: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
是完整类型。您可以使用专业化来完成此任务:
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>
在您尝试从中派生时已完成,因此您没事。