我有以下代码:
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) {
知道我在这里做错了什么吗?谢谢!
正如错误消息所说,a->q
和b->q
,即使用类成员访问运算符需要类型MyNode
是完整的类型。仅前向声明是不够的。
以下类型是不完整的类型:
- 已声明(例如通过前向声明)但未定义的类类型;
和
以下任何上下文都需要完成类 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;
}