4

我有一个Test具有特殊数据结构的类。类的成员Test是 a std::map,其中键是 a std::string,映射值 astruct定义如下:

typedef struct {
  void (Test::*f) (void) const;
} pmf_t;

地图初始化没问题。问题是当我试图调用指向的函数时。我制作了一个重现问题的玩具示例。这里是:

#include <iostream>
#include <map>

using namespace std;

class Test;
typedef void (Test::*F) (void) const;
typedef struct {
  F f;
} pmf_t;


class Test
{
public:
  Test () {
    pmf_t pmf = {
      &Test::Func
    };
    m["key"] = pmf;
  }
  void Func (void) const {
    cout << "test" << endl;
  }
  void CallFunc (void) {
    std::map<std::string, pmf_t>::iterator it = m.begin ();
    ((*it).second.*f) (); // offending line
  }

  std::map<std::string, pmf_t> m;
};


int main ()
{

  Test t;
  t.CallFunc ();

  return 0;
}

提前致谢, 吉尔

4

5 回答 5

5

类型的名称pmf_tf,所以第一个改变是去掉*来获取second.f。这为您提供了一个指向成员值的指针。要使用指向成员的指针,您需要一个实例。您唯一可用的正确类型是this,因此请与->*运算符一起使用:

(this->*it->second.f)();

您需要在整个内容周围加上括号,否则编译器会认为您正在尝试调用it->second.f()(这是不允许的),然后将结果应用于->*.

于 2011-07-27T15:19:57.457 回答
3

有问题的行是试图在没有任何对象的情况下调用成员函数来调用它。如果打算为this对象调用它,我相信调用应该看起来像

( this->* ((*it).second.f) )(); 

this->*为当前对象取消引用指向成员的指针的语法在哪里。((*it).second.f)是从映射中检索到的指针,()是实际调用函数的调用运算符。

这可能是一个很好的练习,但在其他方面用途有限。

于 2011-07-27T15:23:36.377 回答
1

这个问题可能为时已晚,但看似复杂的语法可以分解为两行简单的行,所以看起来很清楚:

void CallFunc (void) 
{
     pmf_t t = m["key"]; //1>get the data from key
    (this->*t.f)();      //2>standard procedure to call pointer to member function
}
于 2011-07-27T15:52:29.517 回答
1

尝试这个:

(this->*((*it).second.f)) ();
于 2011-07-27T15:22:48.373 回答
1

我认为您可能想查看有关此问题的C++ 常见问题解答。语法显然很难正确(他们实际上建议使用宏)。

于 2011-07-27T15:13:37.097 回答