0

我正在使用静态多态性(CRTP 方法)来创建类层次结构。这个想法是在基类中使用派生类中定义的结构。但是,VC10 会产生以下错误:

error C2039: 'param_t' : is not a member of 'D'

和英特尔 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);
}
4

1 回答 1

0

您不能在基类定义中使用派生类的类型。您只能在成员函数体内使用它。当编译器还不知道 D 的嵌套类型时,问题typedef typename Derived::param_t param_t就解决了。当 D 的定义可用时,在 D 的实际实例化之后编译成员函数。class D: public Base<D>

我认为在你的情况下你不能使用 CRTP 方法。

于 2013-05-06T14:41:45.940 回答