stl binary_search выдает ошибку компилятора - PullRequest
0 голосов
/ 23 февраля 2012

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 );
}

Вектор «Пассажир» отсортирован по тем же критериям: «фамилия +», «имя +»

Однако, когда я пытаюсь его скомпилировать, выдает ошибку:

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 не перегружает оператор <, поскольку он не имеет особого смысла. Однако он состоит из некоторых полей, кроме last_name и first_name. </p>

Спасибо за любую помощь.

1 Ответ

1 голос
/ 23 февраля 2012

Вам понадобится специальный компаратор для сравнения указателей пассажиров со строками, например:

binary_search( passList.begin(), passList.end(), stringToSearch,
    [](Passenger * p, string const & name) {return p->name() < name;} );

, где вам может понадобиться изменить p->name() на любой метод, который Passenger предоставляет для извлечения полного имени.

Если ваш компилятор не поддерживает лямбды, то вам нужно определить его отдельно:

// 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());
...