2009-09-04 11 views
2

Mon C++ est un peu rouillé après avoir travaillé en Java et en C# pendant une demi-douzaine d'années. J'ai une petite erreur stupide que je n'arrive pas à comprendre.erreur de syntaxe de modèle C++

J'ai réduit autant que possible le code.

#include <list> 
template<class T> class Subscriber 
{ 
    virtual void published(T t) = 0; 
}; 

template <class T> class PubSub 
{ 
private: 
    std::list< Subscriber<T>* > subscribers; 
public: 
    void publish(T t); 
}; 

template<class T> void PubSub<T>::publish(T t) 
{ 
    for(std::list< Subscriber<T>* >::iterator i = subscribers.begin(); i != subscribers.end(); ++i) 
     i->published(t); 
} 

Lorsque je tente de compiler ce (en incluant ce fichier d'en-tête dans un fichier de code), je reçois l'erreur suivante:

../util/pubsub.h: In member function ‘void PubSub<T>::publish(T)’: 
../util/pubsub.h:18: error: expected `;' before ‘i’ 
../util/pubsub.h:18: error: ‘i’ was not declared in this scope 

Qu'est-ce que je manque ici?

Répondre

6

pour (typename std :: Liste < Abonné *> :: iterator = i ...

+0

Merci. Travaillé parfaitement. – Andrew

4

Ce

std::list< Subscriber<T>* >::iterator 

a besoin d'être ce

typename std::list< Subscriber<T>* >::iterator 

Le compilateur suppose que les noms imbriqués dans les modèles sont des variables statiques (et non des types) jusqu'à ce qu'on leur dise le contraire

6
for(typename std::list< Subscriber<T>* >::iterator i = subscribers.begin(); i != subscribers.end(); ++i) 

Vous avez besoin de typename car iterator est un nom dépendant. Le compilateur doit vérifier le type de modèle T avant de savoir si iterator est un type ou une valeur. Dans ces cas, il suppose qu'il s'agit d'une valeur, sauf si vous ajoutez typename.