代码之家  ›  专栏  ›  技术社区  ›  Andrew

C++模板语法错误

  •  2
  • Andrew  · 技术社区  · 15 年前

    我的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
    

    我这里缺什么?

    3 回复  |  直到 7 年前
        1
  •  6
  •   Baum mit Augen    7 年前
    for( typename std::list< Subscriber<T>* >::iterator i = ...
         ^^^^^^^^
    
        2
  •  6
  •   Stack Overflow is garbage    15 年前
    for( typename std::list< Subscriber<T>* >::iterator i = subscribers.begin(); i != subscribers.end(); ++i )
    

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

        3
  •  4
  •   Tyler McHenry    15 年前

    这个

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

    必须是这个

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

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