std :: function的问题

时间:2013-01-29 23:27:21

标签: c++ function compiler-errors std

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

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

AnotherClass.h

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

AnotherClass.cpp

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

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

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

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

感谢。

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

如果要绑定成员函数调用this->anotherFunction(),请说:

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