【问题标题】:Problems with std::functionstd::function 的问题
【发布时间】:2023-03-06 21:25:01
【问题描述】:

这就是我的代码设置方式:

class SomeClass
{
public:
    std::function<void()> someFunction;
}

另一个类.h

class AnotherClass
{
public:
    void anotherFunction();
    void yetAnotherFunction();
    SomeClass someClass;
}

另一个类.cpp

void AnotherClass::anotherFunction()
{
    std::cout << "triggerd" << std::endl;
}

void AnotherClass::yetAnotherFunction()
{
    someClass.someFunction = &AnotherClass::anotherFunction; //here
}

这导致编译时错误:error C2664: 'std::_Func_class&lt;_Ret&gt;::_Set' : cannot convert parameter 1 from '_Myimpl *' to 'std::_Func_base&lt;_Rx&gt; *' 经过一番研究,我发现这是来自 VS2012 (source) 的错误。因此,我将标有“此处”的行更改为someClass.someFunction = std::mem_fn(&amp;AnotherClass::anotherFunction);,就像解决方案在链接中所说的那样。但是,现在这会导致另一个编译时错误:error C2562: 'std::_Callable_obj&lt;_Ty&gt;::_ApplyX' : 'void' function returning a value。因此,根据我对该错误的研究,这意味着有一个声明为 void 的函数返回一个值。这就是我卡住的地方,因为我 100% 确定我没有任何函数返回不应该加上的值,而且在更改标记为“here”的行之前我没有收到此错误。我不确定这是否是 VS2012 中的另一个错误,但错误确实显示:std::_Callable_obj&lt;_Ty&gt;::_ApplyX 这显然不是我的功能。

有人知道为什么会发生这种情况以及我该如何解决吗?

谢谢。

【问题讨论】:

  • 您的 std::function 包含错误的函数类型来保存成员函数。要么改变它,要么绑定一个实例。
  • AnotherClass::anotherFunction 不是函数。这不是你可以调用的东西。想一想。

标签: c++ function compiler-errors std


【解决方案1】:

您正在为 function 对象分配一个非静态成员函数,该对象期望返回 void 并且不接受任何参数。非静态成员函数有一个隐式的第一个参数,在这种情况下,它的类型为AnotherClass*。您需要一个AnotherClass 实例才能绑定到成员函数。

在您的情况下,您可以将其绑定到this 指针:

void AnotherClass::yetAnotherFunction()
{
    someClass.someFunction = std::bind(&AnotherClass::anotherFunction, this);
}

【讨论】:

    【解决方案2】:

    如果要绑定成员函数调用this-&gt;anotherFunction(),那么说:

    somceClass.someFunction = std::bind(&AnotherClass::anotherFunction, this);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-18
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多