我正在使用静态多态(CRTP方法)来创建类层次结构。我们的想法是使用在基类中派生类中定义的结构。但是,VC10会生成以下错误:
error C2039: 'param_t' : is not a member of 'D'
和Intel C ++生成以下错误:
error : incomplete type is not allowed
Derived::param_t
是struct
类型并且应该正常编译,这令人困惑。请在代码中指出问题。感谢。
// Base class
template<typename Derived>
struct Base {
typedef typename Derived::param_t param_t; //error c2039
void setParam(param_t& param);
const param_t& getParam() const;
...
};
// Derived class
class D: public Base<D> {
public:
struct param_t {
double a, b, c;
};
D(param_t& param):param_(param) {}
...
protected:
param_t param_;
};
int main()
{
D::param_t p = {1.0, 0.2, 0.0};
D *pD = new D(p);
}
答案 0 :(得分:0)
您不能在基类定义中使用派生类中的类型。您只能在成员函数体内使用它。问题是当编译器还不知道嵌套类型为D时typedef typename Derived::param_t param_t
已解析class D: public Base<D>
。当D的定义可用时,在D的实际实例化之后编译成员函数。
我认为在你的情况下你不能使用CRTP方法。