1

为什么这是一个错误:即。不是 long long 和 long double 不同的类型吗?

../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); .

4

2 回答 2

3

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

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

pRow -> updatePair(924, 0.0L);

将调用long double版本。

或者:

pRow -> updatePair(924, 0LL);

将调用long long版本。

于 2009-09-30T15:52:36.497 回答
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 -> longvs int -> double。另一个调用具有相同的类型,只是值不同,因此表现出相同的行为。

Onlyfloat -> 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

于 2009-09-30T15:54:03.173 回答