Следующий код не работает, он дает следующие ошибки:
Нет подходящей функции для вызова объекта типа 'const-компаратор'
а также
Вызов объекта типа 'value_compare' (aka 'std :: _ 1 :: _ map_value_compare, int, comparer, true>') неоднозначен
Вот код:
struct comparer
{
bool operator()(const std::string x, const std::string y)
{
return x.compare(y)<0;
}
};
int main(int argc, char **argv)
{
vector< map<string,int,comparer> > valMapVect;
map<string,int,comparer> valMap;
valMapVect.push_back(valMap);
}
Он скомпилирован с Xcode 5.x (так на Mac).
У кого-то есть представление о том, что не так? Я думаю, что он работал некоторое время назад, когда я собирал его в Linux. Является ли это возможным?
Кажется libc++ хочет оператор вызова функции в comparer
быть const
функцией члена:
struct comparer
{
bool operator()(const std::string x, const std::string y) const
{ // ^^^^^ fixes the problem
return x.compare(y)<0;
}
};
Лично я передал бы аргументы как std::string const&
(обратите внимание на &
), но это не изменит, нравится ли libc++ объект сравнения. Я еще не уверен, что стандарт соответствует мандату const
. Я не заметил такого требования, которое подразумевало бы, что функция сравнения должна храниться как mutable
член. Однако, учитывая, что он часто является апатридом, из него желательно извлечь из него ненужную память (т.е. Воспользоваться преимуществами оптимизации пустой базы), что, вероятно, является тем, что делает libc++. Не совсем ясно,
mutable
членом.const
.const
. Однако самым простым решением является вызов функции вызова функции const
.