У нас возникли некоторые проблемы с использованием 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' запрошено
Поскольку у нас есть обходной путь, нам в основном любопытно, почему первая форма вызывает проблемы. Я уверен, что мы что-то упустили, но мы не смогли понять, что это такое.