此代码会抛出编译器错误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() {}
};
答案 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)
此错误表示前向声明不足,就像您使用该类型一样。
你无法解决它。