次の質問で、モーフィアスが提示した問題と非常によく似た問題があります。
Richard Corden によって提案されたソリューションでは、オーバーロード間で区別するために、ユーザーが関数パラメーターの型を明示的に指定する必要があります。ただし、このソリューションは、同じ型のさまざまな数の引数を持つオーバーロードでは機能しないようです。
この例を考えてみましょう(元の質問から派生したもの):
template <typename T>
class A
{
public:
template<class Arg1>
void connect(void (T::*f)(Arg1))
{
//Do some stuff
}
template<class Arg1, class Arg2>
void connect(void (T::*f)(Arg1,Arg2))
{
//Do some stuff
}
void connect(void (T::*f)())
{
//Do some stuff
}
};
class GApp
{
public:
void foo() {}
void foo(double d) {}
void foo(double d1, double d2) {}
};
int main ()
{
A<GApp> a;
a.connect (&GApp::foo); // foo () - OK
a.connect<double> (&GApp::foo); // foo (double) - FAIL
a.connect<double,double> (&GApp::foo); // foo (double,double) - OK
}
GNU G++ 3.4.5 と MSVC 2008 は上記のコードをコンパイルせず、どちらも同様のエラー メッセージを表示します。
test.cpp: In function `int main()':
test.cpp:36: error: call of overloaded `connect(<unknown type>)' is ambiguous
test.cpp:7: note: candidates are: void A<T>::connect(void (T::*)(Arg1)) [with Arg1 = double, T = GApp]
test3.cpp:13: note: void A<T>::connect(void (T::*)(Arg1, Arg2)) [with Arg1 = double, Arg2 = double, T = GApp]
ポインタをまったく同じ型の変数に代入する(例void (GApp::*tmp)(double) = &GApp::foo;
:connect((void (GApp::*)(double))(&GApp::foo));
ただし、私は最初の解決策を好み、それが機能しない理由を知りたいです。
前もって感謝します!