Josuttis テンプレート ブックを読んでいて、ADL について頭を悩ませようとしています。彼は、「ADL は、呼び出し引数の型に「関連付けられた」名前空間とクラスで名前を検索することによって処理を進める」と述べています。クラスで名前を検索する方法を確認しようとしています。以下に私のテストの例を示します。名前空間で名前を検索する方法がわかります。
class bryan_ns {
public:
class bryan {
public:
enum E { e1 };
static void bryan_test() { std::cout << __PRETTY_FUNCTION__ << std::endl; }
};
void f(bryan::E) { std::cout << __PRETTY_FUNCTION__ << std::endl; }
};
void f(int)
{
std::cout << "::f(int) called\n";
}
int main()
{
f(bryan_ns::bryan::e1); // calls ::f(int)
}
しかし、bryan_ns を名前空間に次のように変更すると:
namespace bryan_ns {
public:
class bryan {
public:
enum E { e1 };
static void bryan_test() { std::cout << __PRETTY_FUNCTION__ << std::endl; }
};
void f(bryan::E) { std::cout << __PRETTY_FUNCTION__ << std::endl; }
};
void f(int)
{
std::cout << "::f(int) called\n";
}
int main()
{
f(bryan_ns::bryan::e1); // calls bryan_ns::f(bryan::E)
}