为什么这会导致编译器错误,说明我的引用不明确?我有一个float
,int
和string
,它们都应该创建单独的函数签名,对吗?
这是我到目前为止所做的:
#include <iostream>
#include <string>
using namespace std;
int plus(int a, int b);
float plus(float a, float b);
string plus(string a, string b);
int main(void)
{
int n = plus(3, 4);
double d = plus(3.2, 4.2);
string s = plus("he", "llo");
string s1 = "aaa";
string s2 = "bbb";
string s3 = plus(s1, s2);
}
int plus(int a, int b) {
return a+b;
} // int version
float plus(float a, float b) {
return a+b;
} // float version
string plus(string a, string b) {
return a+b;
} // string version
答案 0 :(得分:16)
首先,不要使用using namespace std;
。在这种情况下,碰巧有一个名为std::plus
的结构 - 哦,等等,没关系,它实际上被称为plus
并且它的构造函数被抛入到桶中以便用您的函数{{1 }}
其次,您有歧义,因为plus
和3.2
的类型为4.2
,并且可以同样很好地转换为double
或float
。
这是一种简化,但是当涉及将数字传递给重载函数时,C ++基本上使用这些规则:
如果您在特定级别有多个候选人,那么这是一个含糊不清的问题。至关重要的是,int
不会升级为double
- 这将是降级。因此,它必须使用标准转换为float
,这与标准转换为float
,因此这两个重载是不明确的。
答案 1 :(得分:4)
像这样调用浮点过载:
double d = plus(3.2f, 4.2f);
像3.2这样的常量实际上有 double 类型。