尽管多态性在C++中是一种广泛使用的现象,但有时可能会非常复杂。例如,考虑以下代码片段:
#include
using namespace std;
void test(float s,float t)
{
cout << "Function with float called ";
}
void test(int s, int t)
{
cout << "Function with int called ";
}
int main()
{
test(3.5, 5.6);
return 0;
}
似乎对main()中的函数test的调用将导致输出“函数被调用为float”,但是代码给出了以下错误:
In function 'int main()':
13:13: error: call of overloaded 'test(double, double)' is ambiguous
test(3.5,5.6);
函数重载是众所周知的事实,编译器决定在重载函数需要调用哪个函数。如果编译器无法在两个或多个重载函数中选择一个函数,则情况为-“函数重载中的歧义”。
- 上面代码中含糊不清的原因在于,浮动字面量3.5和5.6实际上被编译器视为double。根据C++标准,除非后缀明确指定,否则将浮点字面量(编译时间常数)视为double值(请参见C+++标准的2.14.4) 。由于编译器无法找到带有double参数的函数,因此如果将值从double转换为int或float会感到困惑。
纠正错误:通过提供后缀f ,我们可以简单地告诉编译器字面量是浮点型的,而不是双精度型。
看下面的代码:
#include
using namespace std;
void test(float s,float t)
{
cout << "Function with float called ";
}
void test(int s,int t)
{
cout << "Function with int called ";
}
int main()
{
test(3.5f, 5.6f); // Added suffix "f" to both values to
// tell compiler, it's a float value
return 0;
}
输出:
Function with float called
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。