关于c ++:函数引用不明确

Reference to function is ambiguous

本问题已经有最佳答案,请猛点这里访问。

为什么这会导致编译器错误,说明我的引用不明确? 我有一个floatintstring,它们都应该创建单独的函数签名,对吗?

这是我到目前为止的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#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


首先,不要使用using namespace std;。在这种情况下,碰巧有一个名为std::plus的结构-哦,等等,没关系,它实际上称为plus,并且其构造函数被放入存储桶中以使用名为plus的函数进行重载解析。

其次,您有一个歧义,因为3.24.2的类型为double,并且可以很好地转换为floatint

这是一种简化,但是在将数字传递给重载函数时,C ++基本上使用以下规则:

  • 如果所有参数与重载之一完全匹配,请使用该重载之一。
  • 如果可以将所有参数提升为匹配重载之一,则使用该重载。
  • 如果所有参数都可以进行数值转换以匹配重载之一,则请使用该参数。
  • 如果您在特定级别有多个候选人,那将是模棱两可。至关重要的是,double不会升级为float-这将是降级。因此,它必须使用对float的标准转换,并与对int的标准转换联系在一起,因此这两个重载是模棱两可的。


    像这样调用float重载:

    1
    double d = plus(3.2f, 4.2f);

    像3.2这样的常量实际上具有double类型。