And*_*rew 2 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 );
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它(通过在代码文件中包含此头文件)时,我收到以下错误:
../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
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
for( typename std::list< Subscriber<T>* >::iterator i = ...
^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
for( typename std::list< Subscriber<T>* >::iterator i = subscribers.begin(); i != subscribers.end(); ++i )
Run Code Online (Sandbox Code Playgroud)
你需要typename因为iterator是一个从属名称.编译器必须先检查模板类型,T然后才能知道它iterator是类型还是值.在这些情况下,它假定它是一个值,除非你添加typename.