我正在使用gcc 4.6.1来处理可变参数模板参数。以下代码按预期编译:

template<typename RetType, typename... ArgTypes>
class Event;

template<typename RetType, typename... ArgTypes>
class Event<RetType(ArgTypes...)>
{
public:
    typedef function<RetType(ArgTypes...)> CallbackType;

    void emit(ArgTypes...args)
    {
        for (CallbackType callback : callbacks)
        {
            callback(args...);
        }
    }

private:
    vector<CallbackType> callbacks;
};

但令我惊讶的是,只有一个“参数类型”的以下“普通”版本无法编译:
template<typename RetType, typename ArgType>
class Event;

template<typename RetType, typename ArgType>
class Event<RetType(ArgType)> // <- error: wrong number of template arguments (1, should be 2)
{};

g++ 4.6.1给出错误,如注释中所示。

谁知道为什么会导致错误,以及如何使其正常工作?另外,我认为上述代码是“模板部分特化”的一种形式,对吗?

最佳答案

template<typename RetType, typename ArgType>
class Event;

需要2个模板参数RetTypeArgType,您只给它一个RetType(ArgType)
template<typename RetType, typename... ArgType>
class Event;

需要1个或多个模板参数,RetType和可选的ArgType

09-06 20:51