Function Overloading and float in C++
Although polymorphism is a widely useful phenomena in C++ yet it can be quite complicated at times. For instance consider the following code snippet:
CPP
#include<iostream> 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; } |
It may appear that the call to the function test in main() will result in output “Function with float called” but the code gives following error:
In function 'int main()': 13:13: error: call of overloaded 'test(double, double)' is ambiguous test(3.5,5.6);
It’s a well known fact in Function Overloading, that the compiler decides which function needs to be invoked among the overloaded functions. If the compiler can not choose a function amongst two or more overloaded functions, the situation is -” Ambiguity in Function Overloading”.
- The reason behind the ambiguity in above code is that the floating literals 3.5 and 5.6 are actually treated as double by the compiler. As per C++ standard, floating point literals (compile time constants) are treated as double unless explicitly specified by a suffix [See 2.14.4 of C++ standard here). Since compiler could not find a function with double argument and got confused if the value should be converted from double to int or float.
Rectifying the error: We can simply tell the compiler that the literal is a float and NOT double by providing suffix f. Look at the following code :
CPP
#include<iostream> 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; } |
Output:
Function with float called