関数がオーバーロードされているという事実は、実際には関係ありません。ここでの本当の問題は、関数ポインターとメンバー関数ポインターの違いです。オーバーロードせずにいくつかの例を実行します。
static
解決策:メンバー関数として定義するには、を削除します。または、に置き換えns::ClassA::*ClassA_foo1
ます*ClassA_foo1
。後者が欲しいと思います。typedef
(しかし、他の人がすでに示唆しているように、私は実際に使用することをお勧めします)。
次の2つを検討してください。
namespace ns {
struct ClassA
{
static ClassA foo(long);
};
}
と
namespace ns {
struct ClassA
{
ClassA foo(long);
};
}
前者の場合、fooはstatic
典型的な関数であり、したがって、関数ポインターに格納できます。
ns::ClassA (ClassA_foo1)(long) = &ns::ClassA::foo;
を削除するstatic
と、それは関数ではなくなり、メンバー関数になります。また、メンバー関数へのポインターは関数へのポインターとは異なりthis
、メソッドが呼び出されるオブジェクトとなるオブジェクトを使用して実行する必要があります。
関数ポインタの型には、戻り値の型とパラメータの型が含まれます。ただし、メンバー関数へのポインタの型には、オブジェクトの型も含まれている必要があります。型のオブジェクトにthis
対してからメソッドを実行できるとは期待できません。Circle
BankAccount
関数へのポインタの宣言:
ReturnType (*variable_name) (PARAM1, PARAM2)
メンバー関数へのポインターの宣言:
ReturnType (ThisObjectType::*variable_name) (PARAM1, PARAM2)
この最後の行は興味深いものです。一見すると、それR (A::*v) (P1,P2)
は通常の関数ポインタを宣言し、結果の変数v
をA
スコープに配置すると思うかもしれません。しかし、そうではありません。代わりに、型のオブジェクトを操作するメンバー関数へのポインタを定義しますA
。