8

私の知る限り、2 つの候補関数から選択するとき、コンパイラは最も弱い一致がより強い関数を優先します。たとえば、私が持っている場合:

void boo(int i, char c);  
void boo(double d, int i);

次のコードの場合:

float f = 1.0;  
char c = 'c';
boo(f,c);

boo最初のものは標準型変換であるのに対し、最も弱い一致は昇格であるため、2番目のものを優先する必要があります。

しかし、(gcc を使用して) コンパイルしようとすると、次のようになります。

エラー: ISO C++ は、最初の最悪の変換が 2 番目の最悪の変換よりも優れているにもかかわらず、これらはあいまいであると言います。

何か案は?

4

2 に答える 2

12

オーバーロードの解決に関するあなたの理解は間違っています。一般的な規則 (複数の引数がある場合) は、少なくとも 1 つの引数が優れていて (どれだけ優れているかは問題ではありません)、他の引数がどれも悪くない関数を選択することです。つまり、コンパイラは各引数を個別に処理し、それに「最適な一致」のセットを作成します。この後、これらのセットの和集合が取られます: 交差点に関数が 1 つだけ含まれていれば、勝ちです。そうでなければ、あいまいです。

于 2013-08-09T17:32:52.337 に答える
0

関数 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);
}
于 2013-08-11T09:21:58.817 に答える