2017-02-24 133 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);