1

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

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

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

4

2 回答 2

6

当您尝试获取Function1的地址时,就会出现歧义。编译器看到 2 个重载,它不知道您指的是哪一个。您需要明确指出您想要哪一个:

Bind(
    static_cast<float(*)(float, float)>(&Function1)
);

您在调用时明确指示模板参数Bind,但为时已晚,在此之前就发现了歧义。

于 2013-03-25T11:59:50.270 回答
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++ 允许对同一个函数模板调用进行显式和隐式参数!

另一种解决方案是强制它解析模板名称而不考虑隐式参数。这也有效,但它更hackish:

(*&Bind<float, float>)(&Function1); // Taking address first hides arguments from deduction
于 2013-03-25T11:59:11.063 回答