繁体   English   中英

具有模板化参数的函数指针的歧义

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM