Я пытаюсь найти объект в наборе, а затем вызвать этот метод объектов. Код выглядит следующим образом:
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()){
}
В С++ 11 std::set::find
имеет перегрузку, которая возвращает const_iterator
. Кажется, он вызывает перегрузку вместо версии, которая возвращает iterator
, поэтому, когда вы пытаетесь изменить данные, вы получаете ошибку const
.
Причина этого, скорее всего, связана с более строгим соблюдением того, что значения в наборе ведут себя как ключи (например, неизменяемые). Соответствующий вопрос можно найти здесь.
В принципе, если вы хотите изменить элемент, вы должны удалить его из набора, изменить его и повторно вставить, если вы не можете быть абсолютно уверены, что ваше изменение не повлияет на сравнение вашего набора. Если вы можете быть уверены, что это изменение не нарушит ваш набор, вы можете использовать const_cast
чтобы дать вам доступ к записи для элемента.
Элементы набора неизменяемы, так как, в общем, их изменение изменит их позицию сортировки в наборе. Ваш выбор включает в себя, примерно, увеличение уровня гадости:
map
, разбивая данные клиента на неизменяемый идентификатор и изменяемые данные;mutable
и функцию для изменения it const
;const_cast
чтобы разрешить модификацию.Последние два являются только опцией, если вы уверены, что эта модификация не повлияет на ее позицию в наборе, иначе вы нарушите набор.
Кроме того, не забудьте проверить, был ли найден клиент (т. clientsSet.end()
Что find
не возвращал clientsSet.end()
), прежде чем пытаться получить к нему доступ.
find
возвращает обычный iterator
не типа const_iterator
(если не const)
const_iterator
.
impl
иclientSet