記述されたコードはコンパイルされません。私はあなたがやりたいことについていくつかの「仮定」をし、コードを変更しました。
要約すると、関数パラメーターのタイプを明示的に指定することにより、正しい関数を呼び出すことができます。
connect<double> (&GApp::foo);
connectメソッドがクラステンプレートのメンバーである場合、クラスタイプを指定する必要があるのは1回だけです。
template <typename T> class A
{
public:
template<class Arg1>
void connect(void (T::*f)(Arg1))
{
//Do some stuff
}
void connect(void (T::*f)())
{
//Do some stuff
}
};
class GApp
{
public:
void foo() {}
void foo(double d) {}
};
int main ()
{
A<GApp> a;
a.connect (&GApp::foo); // foo ()
a.connect<double> (&GApp::foo); // foo (double)
}
アップデート:
新しいコードサンプルに応じて、すべての情報が渡されます。「rare」の場合は「signal_void」の場合です。これは、シグナルにテンプレート引数がありますが、メンバー関数にはないためです。したがって、その例を特別な場合に使用して、完了です。以下がコンパイルされます。
template <class Arg = void>
class signal {};
signal<double> signal_double;
signal<> signal_void;
// Arg1 is deduced from signal<Arg1> and then we use it in the declaration
// of the pointer to member function
template<class T, class Arg1>
void connect ( signal<Arg1>& sig, T& obj, void (T::*f)(Arg1) ) {}
// Add special case for 'void' without any arguments
template<class T>
void connect (signal<> & sig, T& obj, void (T::*f)()) {}
void bar ()
{
GApp myGApp;
//Connecting foo()
connect(signal_void, myGApp, &GApp::foo); // Matches second overload
//Connecting foo(double)
connect(signal_double, myGApp, &GApp::foo); // Matches first overload
}