Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема с присвоением итератора / 4 сообщений из 4, страница 1 из 1
19.06.2007, 09:53
    #34603662
Тилир
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с присвоением итератора
Компилятор Microsoft Visual C++ v8

Минимальный код для воспроизведения проблемы следующий:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
// Сложный контейнер
class vector_of_lists{
private:
  std::vector< std::list<int> > adj;
public:
  // ... Полезные методы

  // Итератор
  class adjIterator;
  friend class adjIterator;
};

// Итератор к нему
class vector_of_lists::adjIterator{
private:
  const vector_of_lists& G;
  int v;
  std::list<int>::iterator list_it; // ( 1 )
public:
  adjIterator(const vector_of_lists& G, int v): G(G), v(v){
    // ... Какая-то работа
  };

  // Первый элемент
  int begin(){
    list_it = G.adj[v].begin(); // ( 2 )
    return *list_it;
  };

  // ... Полезные методы
};

Ошибка C2679 вылетает на строчке (2) на этапе компиляции. Ошибки не вылетает, если на строчке (1) изменить iterator на const_iterator, но мне нужен именно неконстантный итератор.

Я бы ещё поверил, что в листе нет обычного итератора, но например вот такой код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
  void testIterator(){
    std::list<int>::iterator ls_iter;
    std::vector< std::list<int> > adj;
    //...
    ls_iter = adj[ 0 ].begin();
    // ...
  }

работает на ура. Почему так можно, а внутри метода класса нельзя?

На всякий случай полный текст ошибки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
2> error C2679: binary '=' : no operator found which takes a right-hand operand of type 'std::list<_Ty>::_Const_iterator<_Secure_validation>' (or there is no acceptable conversion)
2>        with
2>        [
2>            _Ty=int,
2>            _Secure_validation=true
2>        ]
2>        c:\program files\microsoft visual studio 8\vc\include\list(421): could be 'std::list<_Ty>::_Iterator<_Secure_validation> &std::list<_Ty>::_Iterator<_Secure_validation>::operator =(const std::list<_Ty>::_Iterator<_Secure_validation> &)'
2>        with
2>        [
2>            _Ty=int,
2>            _Secure_validation=true
2>        ]
2>        while trying to match the argument list '(std::list<_Ty>::_Iterator<_Secure_validation>, std::list<_Ty>::_Const_iterator<_Secure_validation>)'
2>        with
2>        [
2>            _Ty=int,
2>            _Secure_validation=true
2>        ]
...
Рейтинг: 0 / 0
19.06.2007, 10:07
    #34603702
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с присвоением итератора
Тилир wrote:

> const vector_of_lists& G;
вот из-за этого.

вот тут:
>list_it = G.adj[v].begin()
Нельзя получить неконстантный итератор, пока будет слово const в объявлении.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
19.06.2007, 10:50
    #34603891
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с присвоением итератора
ErV правельно написал, но добалю пару строк:

То что вам требуется неконстантый итератор нарушает вашу схему. Так как ссылка на переданный объект является константной, предпологается, что класс не будет его как-либо модифицировать. list вам в этом помогает, и поэтому для костантного объекта он возвращает константный итератор. Пересмотрите причины из-за которых установлено const и вы возможно поймете, что компилятор спасает вас от ошибок во времени выполнения программы. Или же const указано не верно.
...
Рейтинг: 0 / 0
19.06.2007, 14:43
    #34604997
Тилир
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с присвоением итератора
ErV,

Спасибо за указание на ошибку. Я почему-то сам этого не заметил, и без вашей помощи наверное долго бы ещё на неё глядел.

Akh,

Проблема действительно была в архитектуре, разрешилась введением дополнительно к итератору const-итератора и разделением их функций.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема с присвоением итератора / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]