Click here to Skip to main content
15,867,568 members
Please Sign up or sign in to vote.
2.33/5 (2 votes)
See more:
C++
#include<iostream>
using namespace std;
int add(int,int);
float add(float,float);
void main()
{
	cout<<add(10.20,60.1);
 

}
int add(int a,int b)
{
	return a+b;
}
float add(float c,float d)
{
	return c+d;
}


I am passing floating value but it show ambiguity why?
Posted
Comments
Sergey Alexandrovich Kryukov 12-Dec-13 14:16pm    
In practice, you need to review your interface. These two functions are not practically sensible. If you design practically sensible interface, and do it accurately, then number of similar problems will be naturally reduced to bare minimum, if they even ever appear. Please see my comment to Solution 1. If this is unclear, I'll explain it.
However, I do appreciate your desire to get to the root of the problem.
—SA

Depending on the compiler, you may actually be passing a double value instead of a float. Try using the "f" on the end of your call.

C++
add(10.2f, 60.1f)


I think (trying to go from memory here) that a double can be cast to both a float and an int but must be done explicitly. Without telling it which one to use, the compiler can't choose for you since they are both narrowing conversions (lose data) and it tells you to pick one yourself.
 
Share this answer
 
Comments
Sergey Alexandrovich Kryukov 12-Dec-13 14:09pm    
5, but I was rather pointed out that OP's sample is the example of the poor choice of function naming. So called "operator overloading" is only good where the compiler's ability to resolve ambiguity is well used. The example of good use: different number of parameters, the use of the completely mutually unassignable argument types at the same position.
—SA
[no name] 12-Dec-13 16:08pm    
But actually i did not write function for double then why compiler confuse?
yes if i write one more function for double then compiler should confuse between float and double but i did not write then how compiler is get confuse?
Ron Beyer 12-Dec-13 16:12pm    
Because both are narrowing conversions, so it will not pick them for you. Yes, it seems like Float is closest to double, but in fact they are both the same size byte wise and the compiler will not make a guess as to which one you want. You need to specify, that's just how it works.
BillW33 13-Dec-13 11:18am    
You have one add method that takes an int and one add method that takes a float, but you are calling the add method [add(10.20,60.1)] with doubles. When you write a decimal number such as 10.20 the compiler treats it as a double unless you put an f after it to tell the compiler that the number is a float. That is why Ron Beyer recommended using "add(10.2f, 60.1f)".
Ron's got the gist of what's wrong - you're not passing floats: 10.20 and 60.1 are double constants.

Either make your constants floats (10.20f and 60.1f) or add a double overload for the function.
 
Share this answer
 
Comments
Aescleal 12-Dec-13 17:37pm    
Hi Mr. Univoter, any clue as to what's factually incorrect with my answer? I'd like to know so I can improve my practice in the future. I don't indulge in tit-for-tat down voting so please don't worry about some sort of petty retaliation.

Ash

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900