>>752
template <typename T> T print();
って宣言されてんだから、どう考えても
(T=intの場合) int print<int>()
か
(T=Hogeの場合) Hoge print<Hoge>()
にしかならない

もう1個テンプレートクラスかませて
template <typename T> PrintReturn<T>::type print();
として
template<T> class PrintReturn { public: typedef T type; };
template<> class PrintReturn<Hoge> { public: typedef int type; };
とすればいいんじゃないかな
そしたら
(T=intの場合) PrintReturn<int>::type print<int>() → int print<int>()
(T=Hogeの場合) PrintReturn<Hoge>::type print<Hoge>() → int print<Hoge>()
になると思う