関数 f を呼び出したとしましょう。オーバーロードの解決プロセスは次のとおりだと思います
。 1.候補関数のセットを作成します。この一連の関数には、f() を呼び出したポイントからアクセスできる f という名前の関数がすべて含まれています。
2.実行可能な機能のセットを作成します。この一連の関数は、実行可能な各関数のパラメーターの数が、f() の呼び出しに使用した引数の数と一致する候補関数のサブセットです。
3.実行可能な最適な関数を選択します。最良の実行可能な関数は、すべてのパラメーターが、他のすべての実行可能な関数よりも優れた、または同等のランクの暗黙的な変換シーケンスを持つ関数です。. 2 つ以上または 1 つ未満の場合 (厳密には 1 つではありません)、コンパイル エラーが発生します。次の例は、それをうまく示しています。
class cat
{
public:
cat(int);
};
void func(int, int, int, cat)
{
std::cout << 1 << std::endl;
}
void func(int, int, double, double)
{
std::cout << 2 << std::endl;
}
int main()
{
func(1,2,3,4);
}
このコードは、コンパイル エラー (VS) または警告 (g++) を生成します。
以下は正しく実行されます (print 1):
void func(int, int, int, double)
{
std::cout << 1 << std::endl;
}
void func(int, double, double, double)
{
std::cout << 2 << std::endl;
}
int main()
{
func(1,2,3,4);
}