使用前向声明时如何修复“字段类型不完整”错误

mar*_*hon 5 c++ incomplete-type

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() {}
};
Run Code Online (Sandbox Code Playgroud)

Nei*_*irk 4

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

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

  • @black 从技术上讲是的,这将解决前向声明的问题。但对于这个具体的例子,使用参考并不是一个好的答案恕我直言 (2认同)