1

これが私のコード設定の方法です:

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

AnotherClass.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<_Ret>::_Set' : cannot convert parameter 1 from '_Myimpl *' to 'std::_Func_base<_Rx> *'調査の結果、これは VS2012 のバグであることがわかりました ( source )。そのため、「ここ」というラベルの付いた行someClass.someFunction = std::mem_fn(&AnotherClass::anotherFunction);を、リンクに記載されているソリューションと同じように変更しました。ただし、これにより別のコンパイル時エラーが発生します: error C2562: 'std::_Callable_obj<_Ty>::_ApplyX' : 'void' function returning a value. したがって、そのエラーで見つけた調査から、値を返す void として宣言された関数があることを意味します。これは、私が立ち往生している場所です。なぜなら、あるべきではない値を返す関数がないことを 100% 確信しているためです。これがVS2012の別のバグであるかどうかはわかりませんが、エラーには次のように書かれています:std::_Callable_obj<_Ty>::_ApplyXこれは明らかに私の機能ではありません。

なぜこれが起こっているのか、どうすれば解決できるのかについて誰かが情報を持っていますか?

ありがとう。

4

2 に答える 2

5

何かを返し、引数を取らないfunctionことを期待するオブジェクトに非静的メンバー関数を割り当てています。void非静的メンバー関数には暗黙的な最初のパラメーターがあり、この場合は型になりAnotherClass*ます。AnotherClassメンバー関数にバインドするにはインスタンスが必要です。

あなたの場合、それをthisポインタにバインドできます:

void AnotherClass::yetAnotherFunction()
{
    someClass.someFunction = std::bind(&AnotherClass::anotherFunction, this);
}
于 2013-01-29T23:29:59.787 に答える
1

メンバー関数呼び出しをバインドする場合は、次のthis->anotherFunction()ように言います。

somceClass.someFunction = std::bind(&AnotherClass::anotherFunction, this);
于 2013-01-29T23:44:47.003 に答える