我有这个用于排序结构的c ++代码,
const bool operator<(P& p) const {
//...
}
在具有“gcc 4.9.2”的linux设备上编译没有任何问题。 但是如果在带有“gcc 4.7.1”的Windows机器上尝试它(Code :: Blocks 13.12附带的那个),它会提供令人讨厌的错误,你可以在这里看到http://pastebin.com/S28tD9kc
对于两种情况下的编译我都使用过:“g ++ -std = c ++ 11”
如果我将“operator&lt;(P&amp; p)”更改为“operator&lt;(const P&amp; p)”,它会神奇地起作用。好吧没问题我犯了一些错误,但为什么第一个不能在Windows机器上工作,如果它在Linux机器上运行没有任何问题的迹象?
答案 0 :(得分:2)
这可能是因为在那些gcc版本中,sort的实现方式不同。我已经在VS2005下检查了它也产生了这样的错误,但是从查看我的stl实现 - 我看到排序时使用了很多const T&
个参数。如果运算符&lt;这将导致相同的错误。用于没有const&amp;参数。我能够使用自定义比较器和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下,它们在运算符&lt;中使用非const参数编译得很好。在VS2015中,sort使用移动语义,这就是我想让它编译的。