设定我已定义:
set < Node*, bool (*)(Node *, Node *) > visited(Node::compare);
比较函数定义:
struct Node {
int config[8][8];
static int n;
Node *parent;
static bool compare(Node *, Node *);
};
int Node::n = 0;
bool Node::compare(Node *a, Node *b) {
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if( a->config[i][j] != b->config[i][j]) {
return true;
}
}
}
return false;
}
现在,在代码的某些方面,我想迭代它。但是,以下代码无效。
for(set <Node*, bool (*)(Node*, Node*)>::iterator itt = visited.begin(); itt != visited.end(); itt++) {
delete (*it);
}
错误是:
error: no match for 'operator<'
(operand types are
'std::set<Node*, bool (*)(Node*, Node*)>::iterator {aka std::_Rb_tree_const_iterator<Node*>}'
and
'std::set<Node*, bool (*)(Node*, Node*)>::iterator {aka std::_Rb_tree_const_iterator<Node*>}'
)
答案 0 :(得分:4)
模板声明中有一堆错误的括号:
set<Node*, bool(*)(Node*, Node*)())>::iterator
^^^
删除它们,错误就会消失。
除此之外,我强烈建议改为使用auto
:
for (auto it = visited.begin(); it != visited.end(); ++it) { ...
或者甚至更好,如果可能的话,使用基于范围的for循环:
for (const auto& node : visited) { ...