2016-12-01 46 views
0

我正在使用A *寻路算法,但遇到了错误时收到了错误,当我将一个名为节点的结构插入到一个集合中时。该错误读取:“错误1错误C2678:二进制'<':找不到操作符找到类型为'const节点'的左手操作数(或没有可接受的转换)”,但该错误在另一个文件中找到'XSTDDEF '我没有看过。我不确定它的含义。将结构插入到集合时遇到问题C++

struct node{ 
    int f; 
    int g; 
    int h; 
    int x; 
    int y; 
}; 

node coords[24] = { -1 }; 

std::set<node> open; 
std::set<node> closed; 

int main(int argc, char *argv[]){ 
    coords[4].g = 0; 
    coords[4].h = heuristic(start, end, start.h); 
    coords[4].f = start.g + start.h; 
    coords[4].x = 4; 
    coords[4].y = 0; 

    open.insert(coords[4]); 
+0

你需要'运营商<''对于作为node'你的编译器会告诉你 –

+0

这意味着你的结构不必须操作<它集需要。 – Borgleader

+2

错误消息指出**完全**有什么错 - 您没有为您的struct'node'提供'operator <'。 –

回答

1

正如你可能知道,如果你已经熟悉了std::set的文档,它是一个有序的容器。因此,必须有一种方法来比较集合中的元素,以便可以对它们进行排序。从文档中,我们知道std::set的默认比较函数是std::less<T>

而且,正如你可能知道,std::less<T>作用:

除非专业化,调用操作<的T类型

由于std::less不是专用于node,它使用operator<

错误消息告诉您operator<的过载不存在,const node(或node可以转换为的任何东西)不存在作为左操作数。

解决方案是定义这样的过载。

+0

你不应该专注于'less'来做任何事情,除了使用'<'和那个操作符应该完全比较。如果您需要比较其他方式创建一个比较器类并将它作为'set'的非默认值提供。 –

+0

@CrazyEddie不是我知道这样做的理由,你认为专精'less'是不应该做的事? – user2079303

+0

你应该添加可能的解决方案来完成这个答案 – Slava

0

的std ::设置是一个有序的容器,所以它需要运营商<比较和秩序要素,让快速搜索。如果你不需要这个,你可以使用列表或向量。

0

您需要创建operator<或专门std::less为你的结构。另一种解决办法是使用std::array

struct node : std::array<5,int> { 
    int &f() { return data()[0]; } 
    int &g() { return data()[1]; } 
    int &h() { return data()[2]; } 
    int &x() { return data()[3]; } 
    int &y() { return data()[4]; } 
}; 

,你会从它继承operator<。另一个好处 - 你可以访问底层的数据阵列,这将简化序列化等

相关问题