:
foobar(&MyClass::method);
... &
は、 "参照演算子" ではありませんが、アドレス演算子です。そのオペランドのアドレスをとります。
あなたが実際にはまだ、このような(暗黙の型変換が可能ですが)のようにコード内で自由に関数のアドレスを取る「しなければならない」ん:
goobar(freefunction);
として表現は、このような原因となる可能な暗黙の型変換があります。 Foo
がポインタに壊れてしまいましたが、MSVCに問題がない場合には、GCCにこのようなコードのエラーや警告を受けさせるのが非常に難しかったです。
- 非
static
メンバ関数は、クラスのインスタンスで動作し、かつ点this
ポインタがある:これとは別に 、フリー機能や非静的メンバ関数の間の2つの主な違いがありますクラスそのものに
- フリー・ポインタ関数を使用して作成および呼び出しする構文は、メンバ関数へのポインタの構文とは異なります。
フリー機能の場合
、構文は自明である(っぽい):
void foo(); // Function declaration
void(*f)(); // Declaration of pointer-to-function-returning-void-and-taking-no-parameters
しかし、メンバ関数へのポインタの場合、構文はかなりトリッキーです:
struct Bar
{
void DoIt()
{
}
void DoThat(int n)
{
n;
}
};
void(Bar::*thatfn)(int); // declares a pointer-to-member-function taking int returning nothing
thatfn = &Bar::DoThat; // initializes pointer to point to DoThat(int)
(bar.*thatfn)(42); // call the function
私はC++ FAQをコピー&ペーストすることができましたが、[it](http://www.parashift.com/c++-faq-lite/pointers-to-members.html) – stonemetal
と重複している可能性があります[Errorカッコで囲まれたメンバ関数のアドレス](http://stackoverflow.com/questions/7134 197/error-of-parenthesized-member-functionのあるアドレス) – Nawaz