如何修复"字段的类型不完整"使用前向声明时出错

时间:2014-10-29 18:20:16

标签: 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() {}
};

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

您始终可以FSRVertex设置FSREdge的模板参数。然后编译器必须等待计算FSREdge的大小,直到专门化,而不知道FSRVertex的大小不再是问题。它有点傻,但它可以做你想要的,没有运行时开销:

class FSRVertex; // fwd

template <class FSRVertex_Forward = FSRVertex> // make fwd the default type
class FSREdge_ {
public:
    char fC;
    FSRVertex_Forward fTarget;

    FSREdge_(char c, FSRVertex_Forward target)
        :fC(c), fTarget(target)
    {}

    FSREdge_(const FSREdge_ &other) // std::map requires copy ctor
        :fC(other.fC), fTarget(other.fTarget)
    {}

    FSREdge_() // std::map requires default ctor
    {}
};

typedef FSREdge_<> FSREdge; // so that you don't have to carry the brackets everywhere

class FSRVertex {
public:
    std::map<char, FSREdge> fOutEdges;
    FSRVertex()
        :fOutEdges()
    {}
};

您可以在ideone上看到这项工作。

答案 2 :(得分:-4)

此错误表示前向声明不足,就像您使用该类型一样。

你无法解决它。