Не можете вставить карту в вектор?

0

Следующий код не работает, он дает следующие ошибки:

Нет подходящей функции для вызова объекта типа '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. Является ли это возможным?

  • 0
    Я не вижу проблем с этим.
  • 4
    Я думаю, что ваш оператор () должен быть константным на основе сообщения об ошибке, хотя я не осознавал, что это требование здесь.
Показать ещё 4 комментария
Теги:
vector
map

1 ответ

2
Лучший ответ

Кажется 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++. Не совсем ясно,

  • это ошибка в libc++, т.е. что объект функции сравнения должен быть сохранен mutable членом.
  • в стандарте, чтобы не требовать, чтобы оператор вызова функции был const.
  • в коде, используя его, чтобы сделать оператор вызова функции const.

Однако самым простым решением является вызов функции вызова функции const.

  • 0
    Это должен быть «двоичный тип предиката», но я не могу найти точное определение этого термина.
  • 0
    Спасибо @Dietmar Cool

Ещё вопросы

Сообщество Overcoder
Наверх
Меню