1

グローバル名前空間に関数があり、別の名前空間に引数の型が異なるオーバーロードがある場合、C++Builder コンパイラはグローバル名前空間から関数を見つけられないようです。

namespace A
{
    class a {
        friend void swap(a& first, a& second) { }
    };
}

class b {
    friend void swap(b& first, b& second) { }
};

namespace C
{
    class c {
        A::a dataA;
        b dataB;

        friend void swap(c& first, c& second)
        {
            swap(first.dataA, second.dataA); // no problem
            swap(first.dataB, second.dataB); // VC++12 compiles, C++Builder XE doesn't
        }

        friend void swap2(c& first, c& second) // no problem with a different name
        {
            swap(first.dataA, second.dataA);
            swap(first.dataB, second.dataB);
        }
    };
}

C++Builder で次のエラーが発生します。

E2357 Reference initialized with 'b', needs lvalue of type 'c'
E2342 Type mismatch in parameter 'first' (wanted 'c &', got 'b')

Visual C++ 2012 はこれをエラーなしでコンパイルします。

同じ名前で引数の型が異なる関数が存在する場合でも、グローバル名前空間の関数が見つかるはずであることがわかりました。

何か見落としがありますか、それとも C++Builder のバグですか?

4

2 に答える 2