2010-03-08 4 views
0

J'aiVector iterator

class CBase 
{ 
....... 
}; 

class CDerived : public CBase 
{ 
...... 
}; 

vector<CBase*> mpBase; 
vector<CDerived*>::iterator InfoIt; 

InfoIt=mpBase.begin(); 

VC++ 2008 génère une erreur C2679. Qu'est-ce qui ne va pas?

Répondre

0

Ce n'est pas légal. Vous devez utiliser un itérateur du même type que le vecteur. Si le vecteur contient réellement des pointeurs vers des objets CDerived, définissez vector<CDerived*>. Si ce n'est pas le cas, vous devrez essayer de descendre les objets dans le vecteur, ce qui, bien sûr, peut ne pas réussir. Vous voudrez peut-être regarder dans dynamic_cast dans ce cas.

0

Tous les fichiers CBase ne sont pas CDerived s. Dites qu'il existe d'autres classes dérivées de CBase. Alors qu'est-ce que cela signifie d'interpréter CDerived2 * comme un CDerived *? Qu'est-ce que cela signifie d'interpréter un CBase * comme un CDerived *? Il est possible de mettre ces deux types dans un vecteur CBase.

0

Vous pouvez toujours utiliser un objet pointeur simple; CDerived* foo = (CDerived*)*(mpBase.begin());. Mais comme les autres l'ont dit, ce n'est pas toujours possible.