2017-02-24 121 views
0

Diab编译器在行@@@中抱怨该类型名称不被允许。模板函数调用中的C++错误:不允许输入类型名称

template< 
    Task TASK, 
    Event EVENT> 
class TManager : 
    public AbstractTManager, 
    public common::ITManager 
{ 
    public: 
    typedef os::EManager<TASK> tEManager; 

    TManager() 
    { /* ... */} 

    virtual void init() 
    { 

     tEManager::registerCallback< 
      EVENT, 
      TManager, /* @@@ */ 
      &TManager::func>(*this); 
    } 

    void func() 
    { /* ... */} 
} 

在的eManager registerCallback是这样定义的:

template<TType task> 
class EManager 
{ 
public: 
    template< 
     EType event, 
     typename e_listener, 
     void (e_listener::*TMethod)() 
     > 
    static void registerCallback(e_listener& listener) 
    { 
     /* ... */ 
    } 
} 

第二个模板参数是e_listener与关键字类型名称,所以我不知道为什么它会报告问题。我错过了什么? 提前感谢您的帮助。

+3

请提供[mcve]。 – Barry

+1

可能相关:http://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-the-template-and-typename-keywords。如果编译器将“tEManager”视为一个值,将<<作为小于,并将EVENT作为另一个操作数,然后将'TManager'作为逗号运算符的第二个操作数,那么错误就会适用。 – chris

回答

0

您应该添加template

tEManager::template registerCallback< 
     EVENT, 
     TManager, 
     &TManager::func>(*this);