【问题标题】:Declaration type contains unexpanded parameter pack 'Args'声明类型包含未扩展的参数包“Args”
【发布时间】:2017-02-14 00:08:18
【问题描述】:

我正在尝试编写一个侦听器/回调类,但我在调用方法中get Declaration type contains unexpanded parameter pack 'Args'。 我想称呼为: listeners.call (&ListenerType::myCallbackMethod, arg1, arg2, etc);

好的,我可以创建许多不同数量的参数的调用方法,但如果我可以只做一个方法更好

template <typename ...Args>
void call (void (ListenerClass::*callbackFunction) (Args), Args && ...value) // Compiler error: Declaration type contains unexpanded parameter pack 'Args'
{
    auto iter = listeners.begin(); 
    while (iter != listeners.end())
    {
        if(auto p = iter->lock())
        {
            (p->*callbackFunction) (std::forward<Args>(value)...); 
            ++iter;
        }
        else
            iter = listeners.erase(iter);
    }
};

有什么建议吗? 谢谢!

【问题讨论】:

  • 都在错误信息中。你在哪里有一个名为Args 的未扩展参数包的声明?展开它。
  • 试图重新格式化以避免水平滚动条,但更改了参数的名称 - 这使正确答案无效。我已经回滚了。
  • 顺便说一句,您的设计是一个非常糟糕的主意。转发引用不能这样工作。

标签: c++ c++11


【解决方案1】:

我认为问题出在这里:

template <typename ...Args>
void call (void (ListenerClass::*callbackFunction) /*here->*/(Args), Args && ...value)

这应该是:

template <typename ...Args>
void call (void (ListenerClass::*callbackFunction) (Args...), Args && ...value)

您正在指定您传递的函数指针采用Args 类型的参数,这是一个参数包。所以你只需要用...扩展那个参数包

【讨论】:

  • 在这种情况下,Args 也必须在对std::forward 的调用中扩展?
  • std::forward&lt;Args&gt;(value)... 已经展开了,看这个:stackoverflow.com/a/41071580/1865694stackoverflow.com/q/41071181/1865694
  • 我想你现在有另一个问题。 Args 可以通过两种不同的方式推导出来。
  • 但是如果将 Args 推导出为两个不同的东西,推导不会失败吗?我想问题是......编译器会尝试从哪个出现的 args 中推断出 Args?
猜你喜欢
  • 2018-03-28
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多