我正在使用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个模板参数
RetType
和ArgType
,您只给它一个RetType(ArgType)
。template<typename RetType, typename... ArgType>
class Event;
需要1个或多个模板参数,
RetType
和可选的ArgType
。