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();

这个表达式有两个问题:

  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 回答