Je rencontre ce problème lors de l'écriture de mon propre HashTable. Tout fonctionne, mais quand j'essaye de modéliser la chose, ça me donne des erreurs. Je recréée le problème comme suit:C++ Utilisation d'un argument de modèle de classe en tant qu'argument de modèle pour un autre type
CE CODE WORKS:
typedef double Item;
class A
{
public:
A()
{
v.push_back(pair<string, Item>("hey", 5.0));
}
void iterate()
{
for(Iterator iter = v.begin(); iter != v.end(); ++iter)
cout << iter->first << ", " << iter->second << endl;
}
private:
vector<pair<string, double> > v;
typedef vector< pair<string, double> >::iterator Iterator;
};
CE CODE NE PAS:
template<typename ValueType>
class B
{
public:
B(){}
void iterate()
{
for(Iterator iter = v.begin(); iter != v.end(); ++iter)
cout << iter->first << ", " << iter->second << endl;
}
private:
vector<pair<string, ValueType> > v;
typedef vector< pair<string, ValueType> >::iterator Iterator;
};
les messages d'erreur: g ++ -O0 -g3 -Wall -c -fmessage -longueur = 0 -omain.o .. \ main.cpp
.. \ main.cpp: 50: error: std::vector<std::pair<std::string, ValueType>, std::allocator<std::pair<std::string, ValueType> > >' is not derived from type
Type B »
.. \ main.cpp: 50: erreur: ISO C++ interdit la déclaration de `itérateur 'sans type
.. \ main.cpp: 50: erreur: attendue`;' avant "Iterator"
.. \ main.cpp: Dans la fonction membre vide B :: itérer():
.. \ main.cpp: 44: Erreur: `Iterator 'n'a pas été déclarée dans cette portée
.. \ main.cpp: 44: erreur: attendu `; ' avant "iter"
.. \ main.cpp: 44: Erreur: `iter » n'a pas été déclarée dans ce champ
Quelqu'un sait-il pourquoi cela se passe? Merci!
devrait-il pas: typedef vecteur typename>: : itérateur de l'itérateur; ? –
Tomek
@Tomek: 'pair' ne peut être qu'un type car 'pair' est un modèle de classe. Donc le compilateur sait que c'est un type et il n'est pas nécessaire de le désambiguïser avec 'typename'. –
sth
Tomek: ça marche très bien sans ça, donc je suppose que ça va. Vous ne dites pas par exemple paire :: first_type ici, donc vous n'avez pas besoin de ce nom de type. –
iksemyonov