class Foo
{
public:
	template<typename R, typename T, typename S>
	static R add(T x, S y) { return x + y; }
};

template<typename Foo, typename T>
inline T add(T x, double y)
{
	return Foo::add<T, T, double>(x, y);
}

int main()
{
	Foo::add<double>(3.0, 4.0);
	return 0;
}