4

为什么以下不编译?

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不能访问它的子类型?我用静态函数而不是 typedef 进行了同样的尝试,效果很好。

我尝试了 GCC 4.4.2 和 clang 3.0。

4

2 回答 2

1

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

替代方案的范围可以从简单到非常复杂。如果可以的话,可能最简单的方法是避免使用 Child::Type 直到您真正需要它(本质上是惰性评估)。如果您准确地说明您想要实现的目标,这将有所帮助。

于 2012-03-02T22:50:31.607 回答
1

在完成 stinky472 答案时,如果您base依赖于 Type,那么您可能会做得比

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

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

虽然它没有那么干净。

于 2012-03-02T22:55:10.030 回答