Глупая ошибка компиляции с использованием списков / итераторов (C ++) - PullRequest
0 голосов
/ 28 октября 2009

Следующее не компилируется, и я не могу на всю жизнь понять почему!

#include <list>
using namespace std;

list<char> myList;
list<int>::iterator it;

it = myList.begin();

Ошибка:

error C2679: binary '=' : no operator found which takes a right-hand operand of type 'std::list<_Ty>::_Iterator<_Secure_validation>' (or there is no acceptable conversion)

Ответы [ 2 ]

5 голосов
/ 28 октября 2009

Это происходит потому, что list<char> and list<int> - это два разных класса.Так что их итераторы тоже разных типов.
Если вы посмотрите на код класса std :: list, вы увидите что-то вроде:

typedef _Iterator<_SECURE_VALIDATION_DEFAULT> iterator;

или

typedef _Iterator<bla_bla_bla> iterator;

Это означает новый типопределяется каждым отдельным списком классов.Другими словами, каждый список определяет свой собственный тип итератора.

Измените свой код на это:

list<char>::iterator it;
3 голосов
/ 28 октября 2009

Поскольку тип итератора различен:

list<char> myList; // char
list<int>::iterator it; // int

Помните, что типом списка или любого другого контейнера является не только шаблон тип параметр , но и все остальные параметры шаблона. Например:

list<char, MyAllocator> mylist;
list<char, YourAllocator> yourlist;
// typeof mylist != type of yourlist      (!!!)
...