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

この場合、最初のグループのコンバージョンは両方とも完全一致ですが、2 番目のグループのコンバージョンは両方ともコンバージョンです。それらは均等にランク付けされています - それはint -> longvsのようなものint -> doubleです。もう一方の呼び出しは同じ型で、値が異なるだけなので、同じ動作を示します。

int よりも小さい整数型のみfloat -> doubleが 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

その場合、2 番目の引数は のパラメーターに変換されると、より適切な変換シーケンスになります#1

于 2009-09-30T15:54:03.173 に答える