2012-03-02 61 views
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和铿锵3.0。

+0

[C++静态多态性(CRTP)和使用派生类的typedefs可能的重复](http://stackoverflow.com/questions/6006614/c-static-polymorphism-crtp-and-using-typedefs-from-derived - 班) – thirtythreeforty 2016-08-01 14:24:15

回答

1

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

替代品可以从简单到非常复杂。如果你能做到这一点,最简单的方法可能就是避免使用Child :: Type,直到你真正需要它(懒惰的评估,本质上)。如果你确切地说明你想达到什么,这将会有所帮助。

1

在completement到stinky472答案,如果你base取决于其类型,那么你可以做的比

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

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

这不是干净,虽然差了很多。