从模板化的父级访问子typedef

时间:2012-03-02 22:44:55

标签: c++ templates crtp

为什么以下不能编译?

template <typename Child> struct Base
{
    typename Child::Type t; // Does not compile. "No type named Type in Child"
};

struct Derived : public Base<Derived>
{
    typedef int Type;
};

Base如何无法访问其Child的类型?我尝试使用静态函数而不是typedef,这样就可以了。

我尝试了GCC 4.4.2和clang 3.0。

2 个答案:

答案 0 :(得分:1)

这种代码不起作用,因为在实例化Base时尚未完全定义Derived。它基本上是一个不完整的类型。

替代品可以从简单到非常复杂。可能最简单的方法,如果你能做到,就是避免使用Child :: Type,直到你真正需要它(懒惰的评估,基本上)。如果你准确说明你想要实现的目标,那将会有所帮助。

答案 1 :(得分:1)

在stinky472答案的完成中,如果base依赖于类型,那么你可能会比

更糟糕
template<typename Child, typename Type>
struct base
{
     Type t;
};

   struct Derived : public Base<Derived, int>
{
};

虽然不是那么干净。