8

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

这是我到目前为止所拥有的:

#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
4

2 回答 2

19

首先,不要使用using namespace std;. 在这种情况下,碰巧有一个名为的结构——std::plus哦,等等,别介意,它实际上被调用plus了,它的构造函数被扔到桶中,以便用你的函数调用重载解决方案plus


其次,您有歧义,因为3.2and4.2是类型double,并且可以很好地转换为floator int

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

  1. 如果所有参数与重载之一完全匹配,则使用该重载。
  2. 如果可以提升所有参数以匹配其中一个重载,则使用那个。
  3. 如果所有参数都可以进行数字转换以匹配其中一个重载,则使用该重载。

如果您在特定级别有多个候选人,那么这是一个模棱两可的问题。至关重要的是,adouble不会升级为floata——那将是降级。所以它必须使用到 a 的标准转换float,这与到 a 的标准转换相关int,所以这两个重载是模棱两可的。

于 2013-02-23T06:20:24.630 回答
4

像这样调用浮点重载:

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

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

于 2013-02-23T06:15:09.370 回答