当类在main()中时,为什么这个std::sort谓词会失败

Why does this std::sort predicate fail when the class is inside main()?

本文关键字:std sort 谓词 失败 为什么 main 中时      更新时间:2023-10-16

这是一个非常简化的repro,它说明了class Predicatemain()之外的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);