我有一段用于对结构进行排序的 C++ 代码,
const bool operator<(P& p) const {
//...
}
它在带有“gcc 4.9.2”的 linux 设备上编译没有任何问题。 但是,如果在装有“gcc 4.7.1”(Code::Blocks 13.12 附带的那个)的 Windows 机器上尝试它,它会给出令人讨厌的错误,您可以在此处看到http://pastebin.com/S28tD9kc。
为了在这两种情况下进行编译,我都使用了:“g++ -std=c++11”
如果我将“operator<(P& p)”更改为“operator<(const P& p)”,它会神奇地起作用。好的,没问题,我犯了一些错误,但是如果第一个在 linux 机器上可以正常工作而没有任何问题迹象,为什么第一个在 windows 机器上不能工作?
安example .
最佳答案
这可能是因为在那些 gcc 版本中排序的实现方式不同。我已经在 VS2005 下进行了检查,它也会产生此类错误,但是通过查看我的 STL 实现 - 我看到排序时使用了很多 const T&
参数。如果 operator< 不带 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 下,使用 operator< 中的非 const 参数都可以正常编译。在 VS2015 中,排序使用移动语义,我想这就是它编译的原因。
关于不同平台上比较方法中的 C++ 常量引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34298050/