2012-12-16 182 views
3

我還是一種新的C++,我只是無法弄清楚如何解決這個錯誤。錯誤我getings說「無效的操作數到二進制表達式」。有沒有人有任何想法如何解決這個問題?任何幫助表示讚賞!我正在使用Xcode 4.5.2。謝謝!C++無效的操作數到二進制表達式在xcode

[編輯] OK。我更新了下面的代碼。我仍然得到同樣的錯誤在同一行(找到())...但這裏的變化...

Vertex myVertex = new Vertex(1); 

Vertex myVertex(1); 

而且加入運算符重載爲<

struct Vertex { 
    int node; 
    bool known; 
    float distance; 
    Vertex *path; 

    Vertex(int n=0, bool known=false, duuble dist=INFINITY): 
    node(n), known(known), distance(dist) {} 
}; 


struct Edge { 
    Vertex target; 
    float weight; 
    bool directed; 

    Edge(Vertex v2, float w, bool dir):target(v2), weight(w), directed(dir) {} 
}; 

class Graph { 
public: 
    /*unrelated members are removed*/ 

    void findVertex() { 
     Vertex myVertex(1); 
     map<Vertex, vector<Edge> >::iterator itr; 
     itr = edges.find(myVertex); // <--- this is the line the error seems to related to 
    } 

    friend bool operator< (const Vertex& lhs, const Vertex& rhs) { 
     return lhs.node < rhs.node; 
    } 



private: 
    /*unrelated members are removed*/ 
    vector<Vertex> vertices; 
    map<Vertex, vector<Edge> > edges; 
}; 
+0

您在findVertex函數中有內存泄漏。你「新」一個頂點,但從不刪除它。 – selbie

+0

'Vertex myVertex = * new Vertex(1);'應該是'Vertex myVertex(1);' –

+0

'find'應該如何工作而無法判斷兩個'Vertex'是否相等? –

回答

3

根據構造上設置的特定嚴格弱排序標準,映射中的元素按從低到高的鍵值進行排序。

您需要爲頂點提供運營商<,例如:提到

bool operator<(const Vertex& lhs, const Vertex& rhs){ 
     return lhs.node < rhs.node; 
    } 

而且Vertex myVertex = *new Vertex(1);泄漏內存大衛和selbie。看看這個鏈接:Why does the use of 'new' cause memory leaks?

變化Vertex myVertex = *new Vertex(1);Vertex myVertex = Vertex(1);

+0

我在概念上理解'new'和'delete'的重要性。但我越來越錯誤(是的,額外的錯誤)'刪除myVertex'。錯誤說「不能刪除表達式頂點」。 爲什麼我不能刪除一個'new'ed對象? – selina

+0

看到我更新的答案。 – billz

+0

我在錯誤的地方運行了'bool operator <(....)'。只要我將它移到'struct Vertex {....};',錯誤就消失了!感謝您指點我正確的方向! – selina

0

我喜歡BillZ的答案。但我永遠不會存儲重複的數據。在頂點和邊緣成員之間存儲重複頂點成員就是這種情況。

考慮這樣做,然後在Vertex類中沒有實現比較運算符。我不知道你的findVertex函數將作爲輸入參數,所以我只是寫了兩種方式。

class Graph { 
public: 
    /*unrelated members are removed*/ 

    void findVertex(int nodeNumber) { 
     map<int, vector<Edge> >::iterator itr; 
     itr = edges.find(nodeNumber); 
    } 

    void findVertex(const Vertex& v) { 
     map<int, vector<Edge> >::iterator itr; 
     itr = edges.find(v.node); 
    } 

private: 
    /*unrelated members are removed*/ 
    vector<Vertex> vertices; 
    map<int, vector<Edge> > edges; 
}; 
+0

我的計劃是讓邊的第一個元素成爲頂點,第二個元素成爲邊的向量,因此我的邊的實現是: map > edges; 所以我在邊緣找到的操作是 map > :: iterator itr; itr =邊緣。find(myVertex); 我嘗試Billz的解決方案,但我仍然得到同樣的錯誤。 我已經添加 朋友布爾操作符<(常量頂點&LHS,常量頂點&RHS){ 返回lhs.node selina

0

我有同樣的問題,終於,我只是改變了Xcode的默認C++庫的構建設置與libstdC++(GNU C++標準庫)。它解決了。

就像下面的圖片。 enter image description here

相關問題