2015-12-15 58 views
0

我有這片的C++代碼進行排序一個結構,C++恆定參考在不同平臺上

const bool operator<(P& p) const { 
    //... 
} 

它編譯沒有一個Linux設備上的任何問題「GCC 4.9.2」。 但如果用「GCC 4.7.1」嘗試在Windows機器上(在附帶代碼:: Blocks的13.12之一),它給了嚴重錯誤,你可以在這裏看到http://pastebin.com/S28tD9kc

對於這兩種情況下我編譯已經使用: 「克++ -std = C++ 11」

如果更改 「運算符<(P & P)」 到 「操作者<(常量P & P)」 奇蹟般地起作用。 OK沒問題我犯了一些錯誤,但爲什麼第一個不能在Windows機器上工作,如果它在Linux機器上工作沒有任何問題跡象?

example

+1

它應該是'const bool operator <(P const&p)const {' –

+0

順便說一下,你可以並且應該使用C :: B的更高版本的gcc。 –

+1

@ M.M不需要'const bool',你已經走得太遠了。 –

回答

2

這可能是因爲在這些gcc版本中,sort的實現方式不同。我已經在VS2005下進行了檢查,它也會產生這樣的錯誤,但是從查看我的stl實現 - 我在排序時看到很多const T&參數。如果使用運算符<而沒有使用const &參數,則會導致相同的錯誤。我能夠編譯使用自定義的比較和const_cast會這樣的代碼:

struct my_comp { 
bool operator() (const P& a, const P& b) const { 
    return const_cast<P&>(a).operator<(const_cast<P&>(b)); 
} 
}; 
std::vector<P> pp(10); 
std::sort(pp.begin(), pp.end(), my_comp()); 

我不知道這是否是正確的代碼,只是寫它編譯實驗。

另一方面,在Visual Studio 2015中,它在運算符<中使用非常量參數編譯得很好。在VS2015中使用移動語義,這是我想讓它編譯。