16

コード スニペットは次のとおりです。なぜこのエラーが発生するのか理解できません。

void
SipObj::check_each_field()
{
  map <std::string, sip_field_getter>::iterator msg;
  string str;
  char name[20];
  bool res = false;
  sscanf(get_payload(), "%s %*s", name);
  LOGINFO(lc()) <<  "INVITE:" << name;
  str = name;
  msg = sip_field_map.find(str);
  if (msg != sip_field_map.end()) {
      sip_field_getter sip_field = msg->second;
      res = (this).*sip_field();
  }
}

 typedef bool (SipObj::*sip_field_getter)();
 static map <std::string, sip_field_getter> sip_field_map;

sip_field_getter関数名のプレースホルダーです

4

3 に答える 3

31
(this).*sip_field();

この式には 2 つの問題があります。

  1. this->*はポインターであるため、ポインターを介してメンバー関数を呼び出すために使用する必要があります。

  2. 関数呼び出し ( ()) は、メンバーごとのポインター演算子 (.*または->*) よりも優先順位が高いため、式を正しくグループ化するには括弧が必要です。

正しい表現は次のとおりです。

(this->*sip_field)();
于 2012-06-05T17:33:26.467 に答える
11

ポインターでメソッドポインターを呼び出しているように見えますが、ドットスター構文で呼び出しています。交換してみる

res = (this).*sip_field();

res = (this->*sip_field)();
于 2012-06-05T17:32:11.897 に答える
5

正しい構文は次のとおりです。

(this->*sip_field)();

または、.の代わりに使用する場合は->、次のようにします。

((*this).*sip_field)();

私は前者の構文を好みます。

于 2012-06-05T17:32:49.743 に答える