Jir*_*Jir 4 c++ pointer-to-member
我有一个Test具有特殊数据结构的类.类的成员Test是std::map键是a的位置std::string,映射值的struct定义如下:
typedef struct {
void (Test::*f) (void) const;
} pmf_t;
Run Code Online (Sandbox Code Playgroud)
初始化地图是可以的.问题是当我试图调用指向的函数时.我制作了一个再现问题的玩具示例.这里是:
#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;
}
Run Code Online (Sandbox Code Playgroud)
先谢谢你,吉尔
pmf_t类型的名称是f,所以第一个更改是删除*要获取second.f.这为您提供了指向成员的指针值.要使用指向成员的指针,您需要一个实例.您唯一可用的类型是正确的this,因此请与->*运营商一起使用:
(this->*it->second.f)();
Run Code Online (Sandbox Code Playgroud)
你需要围绕整个事物的括号,否则编译器认为你试图调用it->second.f()(这是不允许的),然后将结果应用于->*.