在以下问题中,我遇到了与 Morpheus 提出的问题非常相似的问题:
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));
)。
但是,我更喜欢第一个解决方案,并想知道它为什么不起作用。
先感谢您!