[英]Function pointer ambiguity with templated parameters
我试图将重载的函数指针作为参数传递给模板函数。
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个float参数的函数,编译器似乎也无法解析正确的调用。 编译器显示“歧义函数调用”错误。
我在这里创建了一个小样本: http : //liveworkspace.org/code/4kVlUY$195
此错误的原因是什么? 谢谢。
当您尝试获取Function1
的地址时会出现歧义。 编译器看到2个重载,并且它不知道您指的是哪一个。 您需要明确指出您想要的一个:
Bind(
static_cast<float(*)(float, float)>(&Function1)
);
您是在对Bind
的调用中显式指示模板参数,但是为时已晚,在此之前已发现歧义。
您需要手动解决歧义,例如使用强制转换表达式。
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 ++允许对同一函数模板调用使用显式和隐式参数!
另一个解决方案是强制其解析模板名称而不考虑隐式参数。 这个工作太,但它更hackish的:
(*&Bind<float, float>)(&Function1); // Taking address first hides arguments from deduction
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.