ошибка компиляции при использовании std::bind2nd

223
07 февраля 2018, 13:32

Очень долго старался понять в чем же ошибка, когда я использую std::bind2nd.

Поиск через std::bind проходит успешно:

#include <iostream>
#include <map>
#include <functional>
//...
bool equal(const std::pair< int, std::string >& p, const std::string& s)
{
    return p.second == s;
}
int main()
{
    std::map<int, std::string> list;
    //...
    list[5] = "error";
    list[6] = "filled";
    //...
    const std::string for_chack ="error";
    // первый способ поиска
    auto I = std::find_if(list.begin(), list.end(),
                 std::bind(equal, std::placeholders::_1, for_chack));
    ++I;
    std::cout << I->first << std::endl;
    // второй способ
    auto J = std::find_if(list.begin(), list.end(),
                 std::bind2nd(std::ptr_fun(equal),  for_chack));
    ++J;
    std::cout << J->first;
    return 0;
} 

при поиске вторым способом выдается ошибка:

C:\Qt\Qt5.9.0\Tools\mingw530_32\i686-w64-mingw32\include\c++\backward\binders.h:163: error: 'typename _Operation::result_type std::binder2nd<_Operation>::operator()(typename _Operation::first_argument_type&) const [with _Operation = std::pointer_to_binary_function<const std::pair<int, std::__cxx11::basic_string<char> >&, const std::__cxx11::basic_string<char>&, bool>; typename _Operation::result_type = bool; typename _Operation::first_argument_type = const std::pair<int, std::__cxx11::basic_string<char> >&]' cannot be overloaded
       operator()(typename _Operation::first_argument_type& __x) const

Помогите пожалуйста разобраться в чем же ошибка

Answer 1

std::bind1st и std::bind2nd не работают если среди параметров есть ссылки. Измените сигнатуру функции, так, чтобы она принимала значения или указатели, и все заработает.

bool equal(const std::pair< int, std::string > p, const std::string s)
{
    return p.second == s;
}
Answer 2

Насколько мне известно, сейчас уже не рекомендуют использовать bind2nd (а в 17 стандарте и вообще удалены ) и подобные - есть лямбды

// второй способ
auto J = std::find_if(list.begin(), list.end(), [for_chack](const std::pair< int, std::string >& p) {
    return for_chack == p.second;
});
READ ALSO
Путь к файлу программы без консоли. С++

Путь к файлу программы без консоли. С++

Всем привет, мне нужно узнать программно где лежат файл программы

291
Нужна помощь, чтобы разобраться в задаче [требует правки]

Нужна помощь, чтобы разобраться в задаче [требует правки]

Дан одномерный массивНайти количество различных чисел в этом массиве, используя функцию сортировки

262
Проблема синхронизации потоков в Embarcadero Builder C++

Проблема синхронизации потоков в Embarcadero Builder C++

Пишу оконное приложение на Embarcadero C++ Builder XE7, ОС Windows 7В нем при запуске главной формы создается, но сразу не запускается поток

240
Разложение числа на множители

Разложение числа на множители

Всем привет, надо разложить число на множители(определенные)С маленькими числами все работает

272