此代码引发注释中指出的编译器错误error: field ‘fTarget’ has incomplete type。为什么会这样呢?我只是分配该字段,而不做任何需要了解内部内容的操作...还是我吗?也许无法弄清楚拷贝构造函数?

class FSRVertex;  //fwd

class FSREdge
 {
 public:
    char fC;
    FSRVertex fTarget;   //compiler error
    FSREdge(char c, FSRVertex target) : fC(c), fTarget(target) {}  //compiler error
};


class FSRVertex {
public:
    boost::unordered_map<char, FSREdge> fOutEdges;
    FSRVertex() : fOutEdges() {}
};

最佳答案

要将FSRVertex对象作为您的类的成员,编译器需要知道其大小,因此需要查看其完整定义。

可以为您的类提供完整的定义,或者可以存储一个指针(最好是智能指针),该指针指向在构造函数中执行的对象的动态分配拷贝。您将需要将构造函数主体从类外部移动到提供完整定义的位置。这种方法在运行时效率较低。

关于c++ - 使用前向声明时如何解决 "field has incomplete type"错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26637879/

10-11 15:53