2017-06-06 43 views
0

我有一個在Linux上運行的C++代碼,但是我在Windows上得到了一個Visual C++中的錯誤。代碼如下:Visual C++因爲comperator而拋出映射異常

struct dependence { 
    dependence() {} 
    dependence(string CUid, LID sink, LID source, std::string var) 
    : CUid(CUid), sink(sink), source(source), var(var) {} 

    string CUid; 

    LID sink = 0; 
    LID source = 0; 
    std::string var; 
}; 

struct dependenceCompare { 
    bool operator() (const dependence& lhs, const dependence& rhs) const{ 
    return ((lhs.CUid<rhs.CUid) || (lhs.source<rhs.source) || (lhs.sink < rhs.sink) || (lhs.var < rhs.var)); 

    } 
}; 

在Windows上運行的代碼,我得到以下錯誤:

Debug Assertion Failed!" c:\windows\system32\MSCP120D.dll c:\Program Files\Microsoft Visual Studio 12.0\VC\include\xtree line 1795 Expression: invalid operator< When I change the comparator to just one if clause, it works:

struct dependenceCompare { 
    bool operator() (const dependence& lhs, const dependence& rhs) const{ 
     return ((lhs.CUid < rhs.CUid)); 
    } 
}; 

我已閱讀本線,但無法找出問題的所在以及爲什麼它在Linux中使用cmake而不是在Visual Studio C++中。

+0

請嘗試創建一個[最小,完整,可驗證的示例](HTTP: //stackoverflow.com/help/mcve)*非工作*代碼。包括你如何使用你向我們展示的結構。 –

+0

如果在所述調試斷言上按_ignore_會怎麼樣?調試斷言,不是,_technically_,錯誤,並且僅在調試版本中才可見。 –

+0

這是一個調試斷言,不是一個例外。它附帶有趣的說明。你需要養成實際閱讀錯誤/警告對話的習慣。 – IInspectable

回答

6

a.i < b.i || a.j < b.j這樣的東西不是像std::map這樣的東西所要求的「嚴格弱排序」,因爲它意味着給定兩個項目,每個項目可以比另一個小。

它經常可以看到這種形式的多領域的比較:

if(a.i != b.i) return a.i < b.i; 
if(a.j != b.j) return a.j < b.j; 
return a.k < b.k; 

這可能更喜歡你想要什麼:優先權給予一個領域,但使用另一場打破平局。

您可以通過使用std::tie

return (std::tie(a.i, a.j, a.k) < std::tie(b.i, b.j, b.k)); 

爲您的代碼簡化代碼,這將是:

return (std::tie(lhs.CUid, lhs.source, lhs.sink, lhs.var) 
     < std::tie(rhs.CUid, rhs.source, rhs.sink, rhs.var)); 
+0

感謝您的解釋。你知道爲什麼這個bug在VS中被捕獲,但不在Linux中? –

+0

@MoProg因爲不同的標準庫實現已經花費了不同的麻煩來檢查這樣的錯誤。請放心,您的代碼在所有平臺上都是不正確的,並且會對那些沒有事先發出警告的人造成更細微的問題。 – Sneftel