我正在尝试将重载函数指针作为参数传递给模板函数。
float Function1(float par1)
{
return 0;
}
float Function1(float par1, float par2)
{
return 0;
}
template<typename R, typename A1>
void Bind(R(*func)(A1))
{
std::cout << "Correct one called\n";
}
template<typename R, typename A1, typename A2>
void Bind(R(*func)(A1, A2))
{
std::cout << "False one called\n";
}
int main()
{
Bind<float, float>(&Function1);
}
即使我用2浮点参数明确调用该函数,编译器似乎也无法解析正确的调用。 编译器显示“模糊函数调用”错误。
我在这里创建了一个小样本: http://liveworkspace.org/code/4kVlUY$195
这个错误的原因是什么? 谢谢。
答案 0 :(得分:6)
当您尝试获取Function1
的地址时,会出现歧义。编译器看到2个重载,它不知道你指的是哪一个。您需要明确指出您想要的那个:
Bind(
static_cast<float(*)(float, float)>(&Function1)
);
您在调用Bind
时明确指出了模板参数,但为时已晚,在该点之前发现了歧义。
答案 1 :(得分:4)
您需要手动解决歧义,例如使用强制转换表达式。
Bind<float, float>( static_cast< float (*)(float par1, float par2)>( &Function1 ));
根据错误消息,它不是Function1
不明确的,它是Bind
。
Compilation finished with errors:
source.cpp:31:4: error: call to 'Bind' is ambiguous
Bind<float, float>(&Function1);
^~~~~~~~~~~~~~~~~~
source.cpp:18:6: note: candidate function [with R = float, A1 = float]
void Bind(R(*func)(A1))
^
source.cpp:24:6: note: candidate function [with R = float, A1 = float, A2 = float]
void Bind(R(*func)(A1, A2))
问题在于您指定了两个参数<float, float>
,但这并不排除自动推导出第三个参数的可能性。 C ++允许对同一函数模板调用的显式和隐式参数!
另一种解决方案是强制它解析模板名称而不考虑隐式参数。这个works也是如此,但它更加骇人听闻:
(*&Bind<float, float>)(&Function1); // Taking address first hides arguments from deduction