2009-09-04 115 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 

缺少什麼我在這裏?

回答

6

爲(類型名稱的std ::名單<認購*> ::迭代器I = ...

+0

謝謝。完美工作。 – Andrew 2009-09-04 01:48:04

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) 

您需要typename,因爲iterator是從屬名稱。在知道iterator是一個類型還是一個值之前,編譯器必須檢查模板類型T。在這些情況下,它假定它是一個價值,除非你添加typename