2009-10-28 7 views
0

Ce qui suit ne compile pas, et je ne peux pas pour la vie de moi voir pourquoi!Erreur de compilation stupide en utilisant des listes/itérateurs (C++)

#include <list> 
using namespace std; 

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

it = myList.begin(); 

L'erreur:

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) 
+0

Notez que pour les erreurs relatives aux modèles, le compilateur Microsoft imprimera les paramètres de modèle dans la ligne après le message d'erreur. Ainsi, la ligne suivante contiendra quelque chose comme 'avec [Ty_ = int] et [Ty_ = char]'. – MP24

Répondre

5

Cela se produit car list<char> and list<int> sont deux classes différentes. Donc, leurs itérateurs sont aussi de types différents.
Si vous regardez std :: Liste des codes de classe, vous verrez quelque chose comme:

typedef _Iterator<_SECURE_VALIDATION_DEFAULT> iterator; 

ou

typedef _Iterator<bla_bla_bla> iterator; 

Cela signifie nouveau type est défini par chaque liste de classe distincte. En d'autres termes, chaque liste définit son propre type d'itérateur.

Changer votre code à ceci:

list<char>::iterator it; 
+0

Agg, je ne peux pas croire que je n'ai pas vu cela: -S – Justin

+2

Cela signifie généralement que vous avez besoin d'une courte pause;) – alexkr

3

Parce que le type de iterator est différent:

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

Prenez garde que le type de la liste ou tout autre conteneur est non seulement le modèle tapez le paramètre, mais également tous les autres paramètres de modèle. Par exemple:

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