演算子のオーバーロードとは何ですか?
Sbi の有名なOperator オーバーロードFAQ は、これに非常に詳細に答えています。
function
OPの 2 つのバージョンの存在が許可されているのはなぜですか?
これらは異なる関数パラメーターの型(int
およびfloat
) を取るため、有効な関数オーバーロードとして認定されることに注意してください。
オーバーロードの解決とは何ですか?
これは、コンパイラの実装によって最も適切な関数/演算子を選択するプロセスです。最適な実行可能な関数が存在し、一意である場合、オーバーロードの解決は成功し、結果としてそれが生成されます。そうしないと、オーバーロードの解決が失敗し、呼び出しが不正な形式として扱われ、コンパイラが診断を提供します。コンパイラは、暗黙的な変換シーケンスを使用して、最適な一致関数を見つけます。
C++03 標準 13.3.3.1 暗黙の変換:
暗黙的な変換シーケンスは、関数呼び出しの引数を、呼び出される関数の対応するパラメーターの型に変換するために使用される一連の変換です。
暗黙的な変換シーケンスは、次のカテゴリのいずれかになります。
- 標準変換シーケンス (13.3.3.1.1)
- ユーザー定義の変換シーケンス(13.3.3.1.2)
- 省略記号変換シーケンス (13.3.3.1.3)
これらのそれぞれは、実行可能な最良の機能を決定するためにランク付けされていることに注意してください。最良の実行可能な関数は、すべてのパラメーターが、他のすべての実行可能な関数よりも優れた、または同等のランクの暗黙的な変換シーケンスを持つ関数です。標準では、これらのそれぞれについて、それぞれのセクションで詳しく説明しています。標準の変換シーケンスはこの場合に関連しており、次のように要約されます。

解像度のオーバーロードに関する十分な背景があります。
OP のコード例を調べてみましょう。
function(1.2,2.2);
重要な規則: 1.2
andはリテラルであり、データ型 2.2
として扱われます。double
暗黙的な変換シーケンス マッピング中:型
を持つ関数パラメーター リテラルは両方とも、またはバージョンを呼び出すために変換ランクdouble
を必要とし、他よりも一致するものはありません。変換ランクでまったく同じスコアが付けられます。コンパイラは実行可能な最適な一致を検出できず、あいまいさを報告します。 float
int
function(1.2,2);
暗黙的な変換シーケンス マッピング中:
関数パラメーターの 1 つが関数バージョンと完全に一致し、別のパラメーター2
が変換ランクを持っています。パラメーターとして受け取る関数の場合、両方のパラメーターの暗黙的な変換シーケンスは変換ランクです。
したがって、バージョンよりもスコアが高く、最も一致するバージョンを取る関数が呼び出されます。int
1.2
float
int
float
オーバーロードのあいまいなエラーを解決するには?
暗黙の変換シーケンス マッピングにうんざりしたくない場合は、関数を提供し、パラメーターが完全に一致するような方法でそれらを呼び出すだけです。完全一致は他のすべてのスコアよりも高いため、目的の関数が呼び出されるという明確な保証があります。あなたの場合、これを行うには2つの方法があります:
解決策 1:
パラメーターが使用可能な関数と完全に一致するように関数を呼び出します。
function(1.2f,2.2f);
1.2f
と2.2f
は型として扱われるため、関数のバージョンfloat
と完全に一致します。float
解決策 2:
呼び出された関数のパラメーターの型と正確に一致する関数のオーバーロードを提供します。
function(double, double){}
1.2
と2.2
は呼び出された関数として扱われるためdouble
、このオーバーロードと完全に一致します。