问题在这里:
l.call(&foo::func, "hello");
l.call(&foo::func, 0.5);
对于这两行,编译器不知道哪一行foo::func
你指的是。因此,您必须通过提供缺少的类型信息(即foo:func
)通过强制转换:
l.call(static_cast<void (foo::*)(const std::string&)>(&foo::func), "hello");
l.call(static_cast<void (foo::*)(const double )>(&foo::func), 0.5);
或者,您可以提供编译器无法推导的模板参数,这些参数定义了func
:
l.call<void, const std::string&>(&foo::func, "hello");
l.call<void, double >(&foo::func, 0.5);
请注意,您必须使用double
并不是const double
多于。原因是一般情况下double
and const double
是两种不同的类型。然而,有一种情况double
and const double
被视为同一类型:作为函数参数。例如,
void bar(const double);
void bar(double);
不是两个不同的重载,但实际上是相同的函数。