Почему я не могу получить итератор для установки элемента с помощью find?

0

Я пытаюсь найти объект в наборе, а затем вызвать этот метод объектов. Код выглядит следующим образом:

   void ExpenseManager::addCategory(const string &userName, const string &categName){
      Client temp(userName);
      impl->clientsSet.find(temp)->addNewCategory(categName);
   }

Этот метод находится в классе Expensemanager. impl здесь - указатель на внутренний класс, где определяется набор clientsSet (я храню в нем объекты клиента). addNewCategory() - это метод в классе Client.

Я получаю сообщение об ошибке при импорте: "Error 1 error C2662: 'void ExpenseManagerNamespace::Client::addNewCategory(const std::string &)': cannot convert 'this' pointer from 'const ExpenseManagerNamespace::Client' to 'ExpenseManagerNamespace::Client &'"

Есть идеи?

EDIT: Внутренний класс и конструктор:

   class ExpenseManager::Implementation{
   private:
      set<Client> clientsSet;
      set<Client>::iterator clientPosSet;
      friend class ExpenseManager;
   };

   // Constructors/destructor-----------------------------------------------
   ExpenseManager::ExpenseManager()
      : impl(new Implementation()){
   }
  • 0
    Пожалуйста, дайте нам полный тип impl и clientSet
  • 0
    Абсолютно. Собираюсь редактировать это пиши сейчас.
Показать ещё 9 комментариев
Теги:
set
find

2 ответа

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

В С++ 11 std::set::find имеет перегрузку, которая возвращает const_iterator. Кажется, он вызывает перегрузку вместо версии, которая возвращает iterator, поэтому, когда вы пытаетесь изменить данные, вы получаете ошибку const.

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

В принципе, если вы хотите изменить элемент, вы должны удалить его из набора, изменить его и повторно вставить, если вы не можете быть абсолютно уверены, что ваше изменение не повлияет на сравнение вашего набора. Если вы можете быть уверены, что это изменение не нарушит ваш набор, вы можете использовать const_cast чтобы дать вам доступ к записи для элемента.

3

Элементы набора неизменяемы, так как, в общем, их изменение изменит их позицию сортировки в наборе. Ваш выбор включает в себя, примерно, увеличение уровня гадости:

  • Используйте map, разбивая данные клиента на неизменяемый идентификатор и изменяемые данные;
  • Удалите элемент и вставьте модифицированную копию;
  • Объявите изменяемые данные mutable и функцию для изменения it const;
  • Используйте const_cast чтобы разрешить модификацию.

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

Кроме того, не забудьте проверить, был ли найден клиент (т. clientsSet.end() Что find не возвращал clientsSet.end()), прежде чем пытаться получить к нему доступ.

  • 0
    с каких пор? find возвращает обычный iterator не типа const_iterator (если не const)
  • 0
    @Paranaix C ++ 11 добавил версию find, которая возвращает const_iterator .
Показать ещё 4 комментария

Ещё вопросы

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