2016-12-01 73 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<。另一個好處 - 你可以訪問底層的數據陣列,這將簡化序列化等

相關問題