3

私がばかげた質問をしていないことを願っています。Googleで検索しましたが、あまり情報が見つかりませんでした。

Herb Sutter による Exceptional C++ Book Item 31 から引用した次の簡単なコードがあります。

namespace NS
{
    class T{};
    void f(T);
}

void f(NS::T);
int main()
{
    NS::T params;
    f(params);
}

私がそれをコンパイルしたとき:

prog.cpp: 関数 'int main()':
prog.cpp:12:13: エラー: オーバーロードされた 'f(NS::T&)' の呼び出しがあいまい
です prog.cpp:12:13: 注: 候補は:
prog.cpp:8:6: 注: void f(NS::T)
prog.cpp:4:10: 注: void NS::f(NS::T)

の引数依存ルックアップが原因であることは理解していますf。コンパイラは の 2 つのバージョンを検出しました。1fつはグローバル名前空間にあり、もう 1 つはNS名前空間にあります。

私の質問は次のとおりです。

  1. 複数の名前空間で名前を検索する場合、順序はありますか?

  2. 最初に囲んでいる名前空間を検索し、次にグローバル名前空間を常に検索する必要がありますか?

  3. この場合、NS名前空間で既に一致が見つかったのに、なぜあいまいさが残るのでしょうか?

質問が明確でない場合は、お気軽に修正してください。

ありがとうございました。

4

1 に答える 1