2015-11-06 148 views
1

请考虑下面的一段代码。我收到一个编译错误。我应该如何编写自定义比较函数。C++自定义成员比较功能

#include <iostream> 
#include <vector> 
#include <boost/cstdint.hpp> 
#include <utility> 
#include <algorithm> 


class X 
{ 
    public: 
    std::vector<std::pair<boost::uint64_t, boost::uint64_t> > vec; 
    bool cmp(const std::pair<boost::uint64_t, boost::uint64_t>& d1, 
     const std::pair<boost::uint64_t, boost::uint64_t>& d2); 
    void foo(void); 
    void print(void); 
}; 

bool X::cmp(const std::pair<boost::uint64_t, boost::uint64_t>& d1, 
    const std::pair<boost::uint64_t, boost::uint64_t>& d2) 
{ 
    return d1.first < d2.first; 
} 

void X::foo(void) 
{ 
    vec.push_back(std::make_pair(1000, 100)); 
    vec.push_back(std::make_pair(800, 200)); 
    std::sort(vec.begin(), vec.end(), cmp); 
} 

void X::print(void) 
{ 
    for (auto it = vec.begin(); it != vec.end(); ++it) 
    { 
    std::cout << it->first << std::endl; 
    } 
} 

    int 
main() 
{ 
    X x; 
    x.foo(); 
    x.print(); 
    return 0; 
} 

编译错误:

g++ --std=c++11 custom_cmparator.cpp 

custom_cmparator.cpp: In member function ‘void X::foo()’: 
custom_cmparator.cpp:28:40: error: no matching function for call to  ‘sort(std::vector<std::pair<long unsigned int, long unsigned int> >::iterator, std::vector<std::pair<long unsigned int, long unsigned int> >::iterator, <unresolved overloaded function type>)’ 
std::sort(vec.begin(), vec.end(), cmp); 

我应该如何指定 的std ::排序(vec.begin(),vec.end(),CMP);

+2

出于好奇,为什么使用boost :: uint64_t中在从cstdint的类型?您似乎已经在使用C++ 11。 –

+0

这是项目配置的方式。 – gudge

回答

2

我将在此作为备选答案,以防您不想使用静态成员函数或非成员函数或lambda,如@Paul's response中所述。您可以使用std::bind#include <functional>

void X::foo(void) 
{ 
    using namespace std::placeholders; // for _1, _2 etc 

    vec.push_back(std::make_pair(1000, 100)); 
    vec.push_back(std::make_pair(800, 200)); 
    std::sort(vec.begin(), vec.end(), std::bind(&X::cmp, this, _1, _2)); 
} 
4

使其成为静态成员函数或非成员。

如果您需要访问您的比较类成员(虽然你的例子并不需要它),你可以使用下面的评论或这样的拉姆达提到的两种方式:

std::sort(vec.begin(), vec.end(), 
    [this](const std::pair<boost::uint64_t, boost::uint64_t>& d1, 
      const std::pair<boost::uint64_t, boost::uint64_t>& d2) { 
       return this->cmp(d1, d2); 
    } 
); 
+0

如果它必须是一个成员并且是非静态的? – gudge

+0

使用'std :: function'和'std :: bind'? –

+2

@gudge如果你看[这里](http://en.cppreference.com/w/cpp/algorithm/find)的一个可能的实现,你可以看到,谓词的调用是像任何函数调用,而不是通过一个成员函数,这将需要为'Object :: MemberFunctionPtr'类型的'std :: find'重载。所以,长话短说,你不能使用成员函数,除非你通过例如['的std :: mem_fn'](http://en.cppreference.com/w/cpp/utility/functional/mem_fn)。 – vsoftco