メンバ関数ポインタへのintのマップを作成し、コンストラクタの初期化子の内部で初期化しようとしています。このよう :私は、これは正しいが、Visual Studioの2017年であると言うでしょうコンストラクタの初期化子内のマップの初期化子リストを使用
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;
};
は言う:
Error C2664 'std::map,std::allocator>>::map(std::initializer_list>)': cannot convert argument 1 from 'initializer list' to 'std::initializer_list>'
Error C2276 '&': illegal operation on bound member function expression
を使用すると、メンバ関数からオペレータのアドレスを削除すると、最初のエラーメッセージは同じままが、
Error C3867 'X::setState1': non-standard syntax; use '&' to create a pointer to member
intのマップをコンストラクタの初期化子リストの中でメンバ関数ポインタに初期化するにはどうすればよいですか?
興味深い。理由は分かりませんが、クラス名が必要です。なぜなら、X():m {{1、&X :: setState1}} {} 'は動作するが、' X():m {{1、&setState1}} {} 'は – NathanOliver
'メンバー関数のアドレスを明示的に( '&'または崩壊によって)取ることは決してできません。あなたは常に修飾IDを使用しなければなりません –