繁体   English   中英

模板中的函数类型无法编译

[英]Function type in template doesn't compile

我正在使用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;
};

但令我惊讶的是,下面只有一个“Argument Type”的“普通”版本无法编译:

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在注释中给出了错误。

任何人都知道它为什么会导致错误以及如何使其工作? 另外,我认为上面的代码是“模板部分专业化”的一种形式吗?

如果你想制作自己版本的std::function以获得乐趣,它应该如下所示:

template<class Signature>
class Event;

template<class R, class... Args>
class Event<R(Args...)>{
  // ...
};

为什么你的第一个版本的作品已经被@ronag解释,一个参数包( ...模板参数)是指零个 或多个 如果你想要一个std:: / boost::function -like类( int(int, double, char)是一个函数类型,我上面给出的代码仍然是正确的签名,这就是为什么它可以适合单个类型声明,如class Signature )。

template<typename RetType, typename ArgType>
class Event;

预计2个模板参数, RetTypeArgType ,你只给它一个RetType(ArgType)

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

预期有一个或多个模板参数, RetType可选的 ArgType

我认为错误是由于如果模板不是可变参数,那么cpomiler需要标准形式,即类Event<templateArg1, templateArg2> ,这显然不是你用它来提供的。

关于模板专业化:我不同意,如果我没错,你正在做的是转发类Event的声明,然后有效地声明它只是2行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM