#include <iostream>

struct Outer
{
	template<typename T>
	void go()
	{
		std::cout << Test<T>::f() << std::endl;
	}
private:
	template<typename T>
	struct Test
	{
		static int f();
	};
};

extern template struct Outer::Test<int>;
extern template struct Outer::Test<double>;

int main()
{
	Outer o;
	o.go<int>();
	o.go<double>();
}

template<>
int Outer::Test<int>::f()
{
	return 1;
}
template<>
int Outer::Test<double>::f()
{
	return 2;
}

