【问题标题】:Overloaded function. Why it's ambiguous here?重载功能。为什么这里模棱两可?
【发布时间】:2014-03-11 10:22:39
【问题描述】:

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

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++ 说这些是模棱两可的,即使第一个的最差转换比第二个的最差转换更好”

编译器如何在此处进行隐式转换,从而模糊哪个候选者是正确的?

【问题讨论】:

  • 您还忘记了返回类型(默认为int IIRC)。
  • @Jefffrey 不在 C++ 中,这只是一个错误。

标签: c++


【解决方案1】:

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

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

警告:ISO C++ 说这些是模棱两可的,尽管第一个的最差转换比第二个的最差转换更好

GCC 似乎在说,我可以为您解决这个问题,但 ISO C++ 不允许这样做。然而,类型一致性对于良好的代码质量和避免错误很重要。

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

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

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

【讨论】:

  • @Jefffrey C++11[conv.fpint]。注意char是整数类型。
  • @Jefffrey:Angew 说的。 char 是整数类型,适用提升和转换规则。要回答您的问题,不,我无法告诉您标准中的哪个位置,该标准适用于编译器编写者和解决论坛的争论,但我倾向于拥有 25 年的经验;-)
  • @Jeffrey [conv]:“标准转换是具有内置含义的隐式转换 ...标准转换序列是按以下顺序排列的标准转换序列: ...从以下集合中进行零次或一次转换...浮点整数转换。” (emph。我的)
  • 然而,这并不能解释重载解析失败的原因。 charint 是提升,而不是转换,这一事实对于理解这里至关重要。
  • @Clifford 这不是为什么它是模棱两可的。这是模棱两可的,因为对于第一个参数,第一个函数完全匹配,所以更好,因为对于第二个参数,提升 charint 比转换 char 到“更好” double,所以第二个功能更好。如果没有这种区别,第一个函数对于第一个参数会更好,两个函数对于第二个参数会相等,编译器会选择第一个。
【解决方案2】:

C++ 中doubleintchar 之间存在implicit 转换,因此您应该使用static_cast&lt;int&gt; 将数据从char 转换为例如int

function( static_cast<int>(c), static_cast<int>(d) );

这将调用function( int, int );

在您的特定情况下,您使用'a''b' 字符文字,正如我上面提到的,它们具有implicit conversionsintdouble,因为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 charchar 变量是8 位变量,而int 是32 位值,它们具有隐式转换。

【讨论】:

    【解决方案3】:

    为了选择重载 A 而不是重载 B,A 的每个参数的转换必须与 B 的转换一样好或更好,并且至少有一个更好。

    在您的情况下,A 具有(精确匹配,积分->浮动),而 B 具有(积分提升,积分提升)。

    精确匹配优于积分提升,但积分提升优于积分->浮动转换。所以 A 在第一个参数中具有更好的转换,而 B 在第二个参数中具有更好的转换。所以总体来说哪一个更好是模棱两可的。

    【讨论】:

      【解决方案4】:

      ('a', 'b') 用于function(char, double) 不需要对'a' 进行转换,并且需要对'b' 进行浮点整数转换(从chardouble)。

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

      【讨论】:

      • 当然,积分提升比浮动积分更好。 (这在你写的内容中有点隐含,但值得指出。)
      猜你喜欢
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      相关资源
      最近更新 更多