Ошибки компиляции при вызове find_if с использованием функтора - PullRequest
3 голосов
/ 10 июня 2010

У нас возникли некоторые проблемы с использованием find_if для поиска вектора пар для записи, в которой первый элемент пары соответствует определенному значению. Для этого мы определили тривиальный функтор, оператор которого () принимает пару в качестве входных данных и сравнивает первую запись со строкой.

К сожалению, когда мы на самом деле добавляем вызов find_if с использованием экземпляра нашего функтора, созданного с использованием временного строкового значения, компилятор выдает множество сообщений об ошибках. Как ни странно (во всяком случае, для меня), если мы заменим временное на строку, которую мы создали в стеке, вещи, похоже, будут работать.

Вот как выглядит код (включая обе версии):

typedef std::pair<std::string, std::string> MyPair;
typedef std::vector<MyPair> MyVector;

struct MyFunctor: std::unary_function <const MyPair&, bool>
{
  explicit MyFunctor(const std::string& val)
    : m_val(val) {}

  bool operator() (const MyPair& p)
  {
    return p.first == m_val;
  }

  const std::string m_val;
};

bool f(const char* s)
{
  MyFunctor f(std::string(s));  // ERROR
  // std::string str(s);                                                                                                  
  // MyFunctor f(str);              // OK                                                                                                    
  MyVector vec;
  MyVector::const_iterator i = std::find_if(vec.begin(), vec.end(), f);
  return i != vec.end();
}

А вот как выглядит самое интересное сообщение об ошибке:

/ usr / include / c ++ / 4.2.1 / bits / stl_algo.h: 260: ошибка: преобразование из 'std :: pair, std :: allocator>, std :: basic_string, std :: allocator>>' к нескалярному типу 'std :: string' запрошено

Поскольку у нас есть обходной путь, нам в основном любопытно, почему первая форма вызывает проблемы. Я уверен, что мы что-то упустили, но мы не смогли понять, что это такое.

Ответы [ 3 ]

6 голосов
/ 10 июня 2010

Это самый неприятный анализ .

Вы можете сделать:

MyFunctor f(s);

или

MyFunctor f((std::string(s)));

Оригинал объявляет функцию f. f принимает один аргумент, указатель на функцию, принимающую аргумент s и возвращающую std::string.

0 голосов
/ 10 июня 2010
MyFunctor f = MyFunctor(s);

более понятен и работает так же.

0 голосов
/ 10 июня 2010

Первая ошибка в

MyFunctor f(std::string(s));

вызвана тем, что std :: string (s) является rvalue (временным), а функция

explicit MyFunctor(const std::string& val)

требует ссылку, которую нельзя получитьfrom rvalue.

Второе сообщение об ошибке, которое вы получили, заключается в том, что вы перебираете vector<pair<string, string>>, для которого требуется функтор, который принимает ввод типа pair<string, string>, но ваш функтор принимает ввод типа string, который приводит к компиляцииошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...