为什么这是gcc中的“超载模糊”?

时间:2009-09-30 15:26:10

标签: c++ overloading ambiguity

为什么这是一个错误: 即。不是长而长的双重不同类型?

../src/qry.cpp", line 5360: 
Error: Overloading ambiguity between "Row::updatePair(int, long long)" 
and "Row::updatePair(int, long double)".

致电代码: 。 。        pRow - > updatePair(924,0.0);        pRow - > updatePair(925,0.0);

2 个答案:

答案 0 :(得分:3)

常量0.0的类型为double,与您的重载函数不直接匹配。您可能希望编译器选择long double版本,但编译器不希望为您做出这样的假设。

您需要更明确地说明您希望编译器调用哪个版本:

pRow -> updatePair(924, 0.0L);

将调用long double版本。

或:

pRow -> updatePair(924, 0LL);

将调用long long版本。

答案 1 :(得分:1)

                 $1      $2
Row::updatePair(int, long long) // #1
Row::updatePair(int, long double) // #2


// updatePair(924, 0.0); 
//   int -> int (#1)  // $1#1
//   int -> int (#2)  // $1#2
//
//   double -> long long // $2#1
//   double -> long double // $2#2

在这种情况下,第一组中的两次转化都是完全匹配,而第二组中的两次转化都是转化。他们排名相同 - 就像int -> long vs int -> double。另一个调用具有相同的类型,只是不同的值,因此它表现出相同的行为。

只有float -> double才是促销,只有小于int到int的整数类型(对于某些特殊平台的unsigned int)才是促销。所以以下内容不会含糊不清

                 $1      $2
Row::updatePair(int, double) // #1
Row::updatePair(int, long double) // #2


// updatePair(924, 0.0f); 
//   int -> int (#1)  // $1#1
//   int -> int (#2)  // $1#2
//
//   float -> double // $2#1 (promotion - not a ranked as conversion).
//   float -> long double // $2#2

在这种情况下,第二个参数在转换为#1参数时具有更好的转换顺序。