我有以下代码:
class MyNode;
class MyCompare {
public:
bool operator()(MyNode *a, MyNode *b) {
return a->q <= b->q ? true : false;
}
};
class MyNode {
public:
double sum;
double q;
StateNode *parent;
std::priority_queue<MyNode, std::vector<MyNode>, MyCompare> children;
};
但是出现以下编译错误:
error: member access into incomplete type 'MyNode'
return a->q <= b->q ? true : false;
^
..MyNode.h:35:7: note: forward declaration of 'MyNode'
class MyNode;
^
..MyNode.h:39:46: error: unused parameter 'b' [-Werror,-Wunused-parameter]
bool operator()(MyNode *a, MyNode *b) {
知道我在这里做错了什么吗?谢谢!
答案 0 :(得分:3)
如错误消息所述,a->q
和b->q
,即class member access operator的使用要求类型MyNode
为complete type。仅向前声明是不够的。
以下类型是不完整类型:
已声明(例如通过前向声明)但未定义的
- 类类型;
和
以下任何情况都需要T类是完整的:
- 类成员访问运算符应用于类型T的表达式;
您可以在operator()
定义之后移动MyNode
的定义,此时MyNode
完成。例如
class MyNode;
class MyCompare {
public:
bool operator()(const MyNode *a, const MyNode *b) const;
};
class MyNode {
public:
double sum;
double q;
StateNode *parent;
std::priority_queue<MyNode, std::vector<MyNode>, MyCompare> children;
};
bool MyCompare::operator()(const MyNode *a, const MyNode *b) const {
return a->q < b->q;
}