c ++模板语法错误

时间:2009-09-04 01:24:56

标签: c++ syntax templates

在过去的六年中,我的C ++在Java和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

我在这里缺少什么?

3 个答案:

答案 0 :(得分:6)

for( typename std::list< Subscriber<T>* >::iterator i = ...
     ^^^^^^^^

答案 1 :(得分:6)

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

您需要typename因为iterator是一个从属名称。在知道T是类型还是值之前,编译器必须检查模板类型iterator。在这些情况下,它会假定它是一个值,除非您添加typename

答案 2 :(得分:4)

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

需要是这个

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

编译器假设模板中的嵌套名称是静态变量(不是类型),除非另有说明。

相关问题