不同平台上比较方法中的C ++常量引用

时间:2015-12-15 19:46:21

标签: c++ linux windows gcc

我有这个用于排序结构的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机器上运行没有任何问题的迹象?

example

1 个答案:

答案 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使用移动语义,这就是我想让它编译的。