2009-09-04 12 views
2

私のC++はJavaおよびC#で過去半年間使用されていました。私はちょうど私が把握することができない愚かな小さなエラーがあります。C++テンプレートの構文エラー

私はできるだけコードを落としました。

#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); 
} 

私がしようとする(コードファイル内でこのヘッダファイルを含むによって)これをコンパイルすると、私は次のエラーを取得:

../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 

を私はここで何をしないのですか? (型名のstd ::リスト<加入*> ::イテレータ私= ...

答えて

6

テンプレート内のネストされた名前は、それ以外のときは静的変数(型ではない)であると仮定します。

+0

ありがとうございました。完璧に働いた。 – Andrew

4

この

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

この

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

コンパイラにする必要があるため

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

iteratorは従属名であるため、typenameが必要です。コンパイラはiteratorが型か値かを知る前に、テンプレートの種類Tをチェックする必要があります。そのような場合は、typenameを追加しない限り、値と見なします。

関連する問題