この質問に対する回答を得た後、関数ポインターを型定義する有効な方法が 2 つあることを発見しました。
typedef void (Function) ();
typedef void (*PFunction) ();
void foo () {}
Function * p = foo;
PFunction q = foo;
私は今それを好みますFunction * p
がPFunction q
、どうやらこれはメンバーへのポインター関数では機能しません。この不自然な例を考えてみましょう。
#include <iostream>
struct Base {
typedef void (Base :: *Callback) ();
//^^^ remove this '*' and put it below (i.e. *cb)
Callback cb;
void go () {
(this->*cb) ();
}
virtual void x () = 0;
Base () {
cb = &Base::x;
}
};
struct D1 : public Base {
void x () {
std :: cout << "D1\n";
}
};
struct D2 : public Base {
void x () {
std :: cout << "D2\n";
}
};
int main () {
D1 d1;
D2 d2;
d1 .go ();
d2 .go ();
}
しかし、それを新しい優先スタイル: typedef void (Base :: Callback) ()
andに変更するとCallback * cb
、次の時点でコンパイラ エラーが発生します。typedef
メンバー 'Callback' の追加修飾 'Base::'
これが許可されないのはなぜですか?それは単なる見落としですか、それとも問題を引き起こすのでしょうか?