【发布时间】:2018-01-30 16:32:45
【问题描述】:
尝试创建一个 int 到成员函数指针的映射,并在构造函数初始化器中对其进行初始化。 像这样:
class X
{
using STATEFUNC = void(X::*)(int);
public:
X() : m{ { 1, &setState1 } } {}
void setState1(int x) { cout << "state1" << endl; }
void setState2(int x) { cout << "state2" << endl; }
std::map<int, STATEFUNC> m;
};
我会说这是正确的,但 Visual Studio 2017 说:
错误 C2664 'std::map,std::allocator>>::map(std::initializer_list>)': 无法将参数 1 从“初始化列表”转换为 'std::initializer_list>'
错误 C2276 '&':对绑定成员函数的非法操作 表达
当您从成员函数中删除操作员的地址时,第一个错误消息保持不变,但第二个更改为:
错误 C3867 'X::setState1':非标准语法;使用 '&' 创建一个 指向成员的指针
如何将 int 映射初始化为构造函数初始化器列表中的成员函数指针?
【问题讨论】:
-
有趣。不知道为什么,但它需要这里的类名。希望有人会知道为什么
X() : m{ { 1, &X::setState1 } } {}有效但X() : m{ { 1, &setState1 } } {}无效 -
identifier永远不能用于获取成员函数的地址(显式使用&或通过衰减);你总是必须使用一个合格的ID
标签: c++ c++11 initializer-list member-function-pointers