混淆继承和模板

时间:2011-12-21 21:07:36

标签: c++ templates inheritance

以下是我正在寻找的代码,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。 所有事情是如何一起工作的?

1 个答案:

答案 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>在您尝试从中派生时已完成,因此您没事。