重载功能。为什么这里含糊不清?

时间:2014-03-11 10:22:39

标签: c++

我在下面的代码中重载了我的函数:

void function(char x, double y) {
    cout << "char, double" << endl;
}

void function(int x, int y) {
    cout << "int, int" << endl;
}

int main() {
    function('a', 'b');
    return 0;
}

当我尝试编译它时,我说:“[警告] ISO C ++说这些是模棱两可的,即使第一个的最差转换比第二个的最差转换更好”

编译器如何在此处进行隐式转换,以使哪个候选者不对,这是不明确的?

4 个答案:

答案 0 :(得分:10)

文字常量'a''b'的类型为char,因此没有完全匹配。出现歧义的原因是第一个参数与第一个函数匹配,但第二个参数的首选转换为int,与第二个函数匹配。

GCC对此非常明确,发出以下诊断:

  

警告:ISO C ++说这些是模棱两可的,即使第一次转换的最差转换比第二次转换的最差转换

GCC似乎在说,我可以为你解决这个问题,但ISO C ++不会允许它。但是,类型协议对于良好的代码质量和避免错误很重要。

您可以通过强制转换来强制选择:

function( static_cast<int>('a'), static_cast<int>('b') );

或提供function( char, char )重载。

答案 1 :(得分:4)

C ++中的implicitdoubleint之间有char次转化,因此您应该使用static_cast<int>转换来自{{1}的数据以char为例。

int

这将调用function( static_cast<int>(c), static_cast<int>(d) );

在您的特定情况下,您使用function( int, int );'a'字符文字,正如我上面提到的,'b'implicit conversionsint,因为double变量表示在char中输入的字符的ASCII值。因此,我们可以通过以下方式初始化assignment operator变量或unsigned char

char

由于unsigned char a = 97; // the ASCII decimal code for "a" unsigned char b = 'a'; // translates into 97 unsigned char变量是8位变量,而char是32位值,因此它们具有隐式转换。

答案 2 :(得分:2)

对于超载B选择的过载A,A的每个参数的转换必须与B的转换一样好或更好,并且至少一个必须更好。

在你的情况下,A有(完全匹配,整数 - >浮动),而B有(整数提升,整体提升)。

完全匹配优于整数提升,但整体提升优于整数 - >浮动转化。所以A在第一个参数中有更好的转换,而在第二个参数中有B.所以整体上哪个更好是模棱两可的。

答案 3 :(得分:1)

('a', 'b')试用function(char, double)不需要'a'的转换,'b'的浮动积分转换(从chardouble )。

对于function(int, int)'a''b'都需要整体提升(从charint)。