为什么以下不能编译?
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。
答案 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>
{
};
虽然不是那么干净。