私は、特殊なデータ構造を持つクラスTest
を持っています。マップの構造体内からPointer-to-Member-Functionによって指された関数を呼び出す
typedef struct {
void (Test::*f) (void) const;
} pmf_t;
初期化OKです:キーがstd::string
であり、マップされた値は次のように定義struct
あるクラスTest
の std::map
部材があります。問題は、私が指している関数を呼び出そうとしているときです。問題を再現したおもちゃの例を作った。ここでは、次のとおりです。事前に
#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;
}
おかげで、 JIR
丁寧な説明、ありがとう。私はイテレータに 'this'を前置することを考えたことはありませんでした。 – Jir
イテレータにプリフェッチしていません。あなたはそれをメンバーへのポインタ式の前に置いています。 ( ' - >'と '.'演算子は' - > * 'よりも緊密に束縛されます;完全なカッコで囲まれたバージョンがあります:'(this-> *((it-> second).f))() '。 –