0

SFAPin クラスが 1 つあり、メソッドが 1 つあります。

SFAPin::addListener(void (*)(SFAPinEvent&), uint8_t){};

しかし、このメソッドに別のクラスのメソッドを渡そうとしたとき:

void InitialState::lightChange(SFAPinEvent &event){};

light.addListener(&this->lightChange, SFAPinEvent:PIN_CHANGE);

エラー:
'SFAPin::addListener(void (InitialState::*)(SFAPinEvent&), uint8_t)' の呼び出しに一致する関数がありません 注: 候補は: void SFAPin::addListener(void (*)(SFAPinEvent&), uint8_t)

lightChange が静的メソッドである場合、次を使用してうまく機能します。

light.addListener(lightChange, SFAPinEvent:PIN_CHANGE);

しかし、静的メソッドは必要ありません

どうすれば解決できますか?ありがとう

4

2 に答える 2

0

パラメータaddListener()が期待するのは、function へのポインタです。渡す引数は、メンバー関数へのポインターです。これは、関数を渡すか、メンバー関数へのポインターを期待するメソッドを追加することで解決できます

SFAPin::addListener(void (InitialState::*)(SFAPinEvent&), uint8_t)

ただし、オブジェクト ポインターも追加する必要があります。これは、指定されたメソッドで使用できます。

SFAPin::addListener(InitialState &state, void (InitialState::*)(SFAPinEvent&), uint8_t)
于 2013-07-26T08:21:25.977 に答える
0

別の方法は、バインドまたはラムダを使用して、メンバー関数を必要な署名に適合させることです。例えば

bind(&InitialState::lightChange, this, _1);

詳細はこちら

または、C++11 でラムダを使用する

addListener(
  [&] (SFAPinEvent &event)
  {
    lightChange(event);
  },
  SFAPinEvent:PIN_CHANGE
);

詳細はこちら

コンパイルされた静的

「静的メンバー関数は、実際のオブジェクトを呼び出す必要がないため、通常、静的メンバー関数へのポインターは、通常の関数へのポインターと型互換性があります。」(ここから)

于 2013-07-26T08:45:49.720 に答える