Изменение элемента std :: set с помощью итератора: почему мой код не компилируется? - PullRequest
1 голос
/ 03 ноября 2011

Обновлено

Это метод, который доставляет мне неприятности:

void A::normalizeUrls()
{
    for (set<CUrl>::iterator it = _references.begin(); it != _references.end(); ++it)
    {
        if (it->isValid())
        {
            it->normalize().makeFull(_baseUrl);
        }
    }
}    

А вот CUrl :: normalize и CUrl :: makeFull

CUrl& makeFull (CUrl&)
{
    return *this;
}
CUrl& CUrl::normalize()
{
    return *this;
}

Ошибки: CUrl::normalize' : cannot convert 'this' pointer from 'const CUrl' to 'CUrl &'

left of '.makeFull' must have class/struct/union

Почему так, что мне не хватает?

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 03 ноября 2011

auto будет сбрасывать ссылки.Я не знаю, работает ли auto&, но если нет, вам придется явно указать CUrl&.

2 голосов
/ 05 ноября 2011

На практике членами набора являются const (неизменяемые), поэтому вы не можете вызывать неконстантные функции-члены для них.

Если это разрешено, вы можете изменить их значения и сделать недействительнымизаказ комплекта.

2 голосов
/ 03 ноября 2011

Кажется, что вызов _references.begin() возвращает const_iterator вместо обычного итератора.Является ли переменная _references константной ссылкой на набор?

Это определенно проблема с состоянием итератора const .Компилируется следующий код:

if (it->isValid())
{
    CUrl &ref = const_cast<CUrl&>(*it);
    ref.normalize().makeFull(_baseUrl);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...