当类在main()中时,为什么这个std::sort谓词会失败
Why does this std::sort predicate fail when the class is inside main()?
这是一个非常简化的repro,它说明了class Predicate
在main()
之外的delcare是如何工作的,但当确切的代码以class InlinePredicate
的形式内联时,编译器无法匹配std::sort
。奇怪的是,您可以将任何作为第三个参数传递给std::sort
(比如整数7(,当它不支持sort
所期望的operator ()
时,您只会得到编译错误。但当我通过下面的pred2
时,它根本不匹配:
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
class Predicate {
public:
bool operator () (const pair<string,int>& a, const pair<string,int>& b)
{
return a.second < b.second;
}
};
int
main()
{
vector<pair<string, int> > a;
Predicate pred;
sort(a.begin(), a.end(), pred);
class InlinePredicate {
public:
bool operator () (const pair<string,int>& a, const pair<string,int>& b)
{
return a.second < b.second;
}
} pred2;
sort(a.begin(), a.end(), pred2);
return 0;
}
repro.cc:在函数"int main(("中:
repro.cc:30:错误:没有匹配的函数用于调用"sort(__gnu_cxx::__normal_iterator,std::allocater>,int>*,std:,vector,std:;allocater>,int>,std:::allocator>,int>>,__gnu_xx::__normal_iterator、std::分配器>、int>*、std:,vector,std::分配器>,int>、std:;分配器,std:分配器>,int>>,main((:InlinePredicate&">
在C++03中,局部类没有链接,因此不能用作模板参数(§14.3.1/2(。
在C++0x中,此限制已被删除,您的代码将按原样编译。
在C++0x之前的C++版本中,函数内部声明的类不能出现在模板参数中。您对sort
的调用使用设置为InlinePredicate
的模板参数隐式实例化它,这是非法的。
您可能需要考虑使用C++0x(对于GCC,传递--std=c++0x
;在C++0x中,此代码将按原样工作,或者您可以使用匿名函数(或boost::lambda
。对于boost::lambda
,它看起来是这样的:
using namespace boost::lambda;
sort(a.begin(), a.end(), _1 < _2);
- std::sort()函数无法对向量的一部分进行排序
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- C++中"std::sort"比较器的不同类型
- 将用户定义的类型与 std::vector 和 std::sort 一起使用
- 使用 std::sort 对向量进行稳定排序
- std::sort 如何处理重复的数字?
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 使用 std::sort 对二维 c 数组进行排序
- std::stable_sort vs std::sort
- 使用 std::sort 对 C 样式的 2D 数组进行部分排序
- std::vector 未按 std::sort 的预期排序
- 隐式转换为比较函数对象(函子)用于 std::sort 而不是 std::map?
- 为什么只有当我的容器有超过 32 个元素时才由 std::sort 调用交换?
- 在 c++ 中使用 std::sort 与迭代器和模板
- 使用类似的比较函数时,在 c++ 中为 std:sort 获得不同的结果
- 相同的结果 qsort vs std::sort
- 通过 std::sort 对 C 2D 数组进行排序
- 对整个范围进行排序时,std::p artial_sort() 与 std::sort() 的性能?
- 在使用 std::sort() 和 lambda 函数按属性对 ADT 的向量进行排序时遇到问题
- 使用 std::sort 对矩阵进行排序