【问题标题】:Passing a function as a parameter to another function C++将函数作为参数传递给另一个函数 C++
【发布时间】:2016-04-01 20:09:42
【问题描述】:

我正在尝试将名为 read 的函数传递给另一个名为 start 的函数。

void MainPage::read() {
    ...
}

void MainPage::start(std::function< void() > func) {
    ...
}

给我问题并调用 start 函数的行是这一行。它在我的主要功能中。

start( read );

当我尝试编译它时,我收到一个对我没有多大帮助的错误。

C3867   'App1::MainPage::read': non-standard syntax; use '&' to create a pointer to member

我现在无法重现它,但是在尝试以不同方式传递参数时,我遇到了另一个类似这样的错误:

C2664   void App1::MainPage::start(std::function<void (void)>cannot convert argument 1 from 'void(void)' to 'std::function<void (void)>

我正在使用 VS2015 社区并使用 C++ 工作。

【问题讨论】:

    标签: c++ pointers methods


    【解决方案1】:

    问题是你试图在这里传递一个 method 指针,而不是函数指针。方法有一个隐藏的this 参数,只需传递read 即可解除绑定。这种表达式称为成员指针。

    语法上的第一个主要区别是方法指针必须使用其封闭类型进行限定,并且您需要在名称前加上&amp; 运算符。这会给你&amp;MainPage::read,这是一个有效的指向成员的表达式。

    第二步,绑定隐藏的this参数。您可以使用std::bind 执行此操作,它将参数值“附加”到函数(或方法指针)。它返回一个已知可调用且适合构造std::function 的未指定类型。

    startTimer(bind(&MainPage::read, this));
    

    ideone example

    【讨论】:

    • 我尝试在我的代码中使用 std::bind(&MainPage::readPlc, *this) ,但它给了我这些错误:C2672 'std::bind': no matching overloaded function found C2783 'std::_Binder&lt;_Ret,_Fx,_Types...&gt; std::bind(_Fx &amp;&amp;,_Types &amp;&amp;...)': could not deduce template argument for '_Ret'
    • @JesseRuley,尝试不使用*。另外,您是否可能有多个 readPlc 重载?
    • 刚试过没有*,它给了我这个C2672 'std::invoke': no matching overloaded function foundC2893 Failed to specialize function template 'unknown-type std::invoke(_Callable &amp;&amp;,_Types &amp;&amp;...)'另外,readPlc没有重载
    • 此时,这听起来像是 Visual Studio 的问题。你应该试试something like this(将方法调用包装在一个实际的函数中),如果这不起作用,那我也不知道该怎么办了。
    【解决方案2】:

    我能够通过将 read 声明为函数而不是 MainPage 的成员来实现此功能。

    void read() {
        ...
    }
    

    这不是一个完美的解决方案,但对我来说已经足够了。

    【讨论】:

      猜你喜欢
      • 2017-08-07
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多