ALL, 我有这样的代码:
bool ISearchable::PerformSearch(const vector<Passenger *> &passList, const string &lname, const string &fname)
{
stable_sort( passList.begin(), passList.end(), ISortable( 7 ) );
string stringToSearch = lname;
stringToSearch += " ";
stringToSearch += fname;
binary_search( passList.begin(), passList.end(), stringToSearch );
}
'Passenger'向量按相同的标准排序,即last_name +“”+ first_name。
但是当我尝试编译它时会出错:
1>c:\program files (x86)\microsoft visual studio
10.0\vc\include\algorithm(2978): error C2678: binary '<' : no operator
found which takes a left-hand operand of type 'const std::string' (or
there is no acceptable conversion)
1> could be 'built-in C++ operator<(Passenger *, Passenger *)'
1> while trying to match the argument list '(const
std::string, Passenger *const )'
1> c:\users\igor\documents\visual studio
2010\projects\project.cpp(598) : see reference to function
template instantiation 'bool
std::binary_search<std::_Vector_const_iterator<_Myvec>,std::string>(_FwdIt,_FwdIt,const
_Ty &)' being compiled
1> with
1> [
1> _Myvec=std::_Vector_val<Passenger
*,std::allocator<Passenger *>>,
1>
_FwdIt=std::_Vector_const_iterator<std::_Vector_val<Passenger
*,std::allocator<Passenger *>>>,
1> _Ty=std::string
1> ]
1>
错误是什么以及如何解决? 我在这里看到了相同的代码,但它没有任何问题。
Passenger类不会重载运算符&lt;因为它没有多大意义。但它确实包含除last_name和first_name之外的一些字段。
感谢您的帮助。
答案 0 :(得分:1)
您需要一个自定义比较器来将乘客指针与字符串进行比较,例如:
binary_search( passList.begin(), passList.end(), stringToSearch,
[](Passenger * p, string const & name) {return p->name() < name;} );
您可能需要将p->name()
更改为Passenger
提供的任何方法以提取全名。
如果您的编译器不支持lambdas,那么您需要单独定义它:
// In C++03, this must be at namespace scope for some reason.
struct ComparePassengerName {
bool operator()(Passenger * p, string const & name) {
return p->name() < name;
}
};
binary_search( passList.begin(), passList.end(), stringToSearch,
ComparePassengerName());