以下程序使用经典的C ++ Builder编译器进行编译,但未能使用Clang编译器:
#pragma hdrstop
#pragma argsused
#ifdef _WIN32
#include <tchar.h>
#else
typedef char _TCHAR;
#define _tmain main
#endif
#include <stdio.h>
#include <complex>
#include <vector>
#include <algorithm>
typedef std::complex<double> Complex;
bool operator<(const Complex & lhs, const Complex & rhs)
{
return lhs.real() < rhs.real();
}
void doSort()
{
std::vector<Complex> vc;
std::sort(vc.begin(), vc.end());
}
int _tmain(int argc, _TCHAR* argv[])
{
doSort();
return 0;
}
它还编译并链接到经典编译器,但是对于Clang编译器失败,如果我添加显式更少的实例:
std::sort(vc.begin(), vc.end(), std::less<Complex>());
到目前为止,如果我编写一个函数对象,我只能编译Clang编译器:
template <typename T>
struct compLess
{
bool operator()(const T & lhs, const T & rhs) const
{
return lhs < rhs;
}
};
void doSort()
{
std::vector<Complex> vc;
std::sort(vc.begin(), vc.end(), compLess<Complex>());
}
这是否符合新的C ++标准?还有什么我需要做的是让std :: less来识别运算符&lt;复杂?
感谢。
答案 0 :(得分:1)
所涉及的所有类型和模板 - std::vector
,std::complex
,std::sort
和std::less
- 都是namespace std
的成员。 the ADL rules中没有任何内容会导致在全局命名空间中进行查找,因为不涉及该命名空间。特别是因为命名空间std包含operator<
的 lot (只是不需要这里的那个)。
另一方面,对于没有固有顺序的类型(如复数)重载比较并不是一个非常好的主意。它们是二维的,通常不适合线性排序。
使用显式仿函数进行排序顺序的“技巧”(并非真正的技巧)是处理此问题的正确方法。所以就这样做。