ライブラリ内の完全修飾名が必要かどうかを知りたいです。
例 (ここでは、読みやすくするために名前空間をインデントしています):
namespace A {
namespace B {
namespace C {
class Foo { ... };
} // namespace C
::A::B::C::Foo foo;
// or
C::Foo foo
} // namespace B
namespace D {
::A::B::C::Foo foo;
// or
B::C::Foo foo
} // namespace D
} // namespace A
C++ 標準の 3.4 の章を完全には理解していませんでした。また、STL ベクトル ヘッダーで説明できないものを見ました (読みやすいように簡略化しています)。
namespace std {
template<..
class reverse_iterator
{ ... };
template<..
class vector {
typedef _STD reverse_iterator<const_iterator> const_reverse_iterator;
...
}
}
問題は、_STD が ::std:: に展開されることです。しかし、名前の検索に関する私の理解によれば、reverse_iterator は最初にベクトルで検索され、次に std である親名前空間で検索されます。どのように衝突が可能でしょうか?
副次的な質問: 引数を持つテンプレート関数の名前の名前検索規則は何ですか? 修飾された ID は、ADL なしで既に宣言されている名前を直接検索すると思いますが、修飾されていない名前は ADL を実行します。
ご回答ありがとうございます。