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