#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
}