函数指针模糊度与模板化参数

时间:2013-03-25 11:56:23

标签: c++ templates function-pointers

我正在尝试将重载函数指针作为参数传递给模板函数。

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

这个错误的原因是什么? 谢谢。

2 个答案:

答案 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