对函数的引用是模糊的

时间:2013-02-23 06:12:10

标签: c++ function overloading

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

这是我到目前为止所做的:

#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

2 个答案:

答案 0 :(得分:16)

首先,不要使用using namespace std; 。在这种情况下,碰巧有一个名为std::plus的结构 - 哦,等等,没关系,它实际上被称为plus并且它的构造函数被抛入到桶中以便用您的函数{{1 }}


其次,您有歧义,因为plus3.2的类型为4.2,并且可以同样很好地转换为doublefloat

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

  1. 如果所有参数与其中一个重载完全匹配,则使用该参数。
  2. 如果可以提升所有参数以匹配其中一个重载,则使用该参数。
  3. 如果可以对所有参数进行数字转换以匹配其中一个重载,则使用该参数。
  4. 如果您在特定级别有多个候选人,那么这是一个含糊不清的问题。至关重要的是,int不会升级为double - 这将是降级。因此,它必须使用标准转换为float,这与标准转换为float,因此这两个重载是不明确的。

答案 1 :(得分:4)

像这样调用浮点过载:

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

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