#include<iostream>
namespace ns{
struct hoge{};
template<class T>
void f(T&){std::cout<<"ns::f()"<<std::endl;}
}
namespace ns1{
template<class T>
struct hoge1{};
template<class T>
void f1(T&){std::cout<<"ns1::f1()"<<std::endl;}
}
namespace ns2{
struct hoge2:ns1::hoge1<void(ns::hoge (*)())>{};
template<class T>
void f2(T&){std::cout<<"ns2::f2()"<<std::endl;}
}
namespace ns3{
template<class T>
struct hoge3{};
}
int main()
{
ns3::hoge3<ns2::hoge2> a;
//f(a); // ns is not associated namespace
f1(a); // ns1 is associated namespace
f2(a); // ns2 is associated namespace
}
I2luY2x1ZGU8aW9zdHJlYW0+CgpuYW1lc3BhY2UgbnN7CglzdHJ1Y3QgaG9nZXt9OwoJdGVtcGxhdGU8Y2xhc3MgVD4KCXZvaWQgZihUJil7c3RkOjpjb3V0PDwibnM6OmYoKSI8PHN0ZDo6ZW5kbDt9Cn0KbmFtZXNwYWNlIG5zMXsKCXRlbXBsYXRlPGNsYXNzIFQ+CglzdHJ1Y3QgaG9nZTF7fTsKCXRlbXBsYXRlPGNsYXNzIFQ+Cgl2b2lkIGYxKFQmKXtzdGQ6OmNvdXQ8PCJuczE6OmYxKCkiPDxzdGQ6OmVuZGw7fQp9Cm5hbWVzcGFjZSBuczJ7CglzdHJ1Y3QgaG9nZTI6bnMxOjpob2dlMTx2b2lkKG5zOjpob2dlICgqKSgpKT57fTsKCXRlbXBsYXRlPGNsYXNzIFQ+Cgl2b2lkIGYyKFQmKXtzdGQ6OmNvdXQ8PCJuczI6OmYyKCkiPDxzdGQ6OmVuZGw7fQp9Cm5hbWVzcGFjZSBuczN7Cgl0ZW1wbGF0ZTxjbGFzcyBUPgoJc3RydWN0IGhvZ2Uze307Cn0KCmludCBtYWluKCkKewoJbnMzOjpob2dlMzxuczI6OmhvZ2UyPiBhOwogICAgICAgIC8vZihhKTsgLy8gbnMgaXMgbm90IGFzc29jaWF0ZWQgbmFtZXNwYWNlCiAgICAgICAgZjEoYSk7IC8vIG5zMSBpcyBhc3NvY2lhdGVkIG5hbWVzcGFjZQogICAgICAgIGYyKGEpOyAvLyBuczIgaXMgYXNzb2NpYXRlZCBuYW1lc3BhY2UKfQ==