模板函数调用中的C ++错误:不允许输入类型名称

时间:2017-02-24 17:58:09

标签: c++ c++11 templates

Diab编译器在@@@行中抱怨不允许使用类型名称。

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)
    {
        /* ... */
    }
}

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

2 个答案:

答案 0 :(得分:0)

您应该添加template

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

答案 1 :(得分:0)

谢谢Jarod42和克里斯。有用!我错过了这个非常有价值的主题,包括“模板关键字”一章中的解决方案: Where and why do I have to put the "template" and "typename" keywords?