template<typename T> class hoge {
private:
 T val;
friend hoge<T> operator+(const hoge<T>& h1, const hoge<T>& h2);
}
hoge<T> operator+(const hoge<T>& h1, const hoge<T>& h2);

としていたのを、

templaate class hoge<T>;
hoge<T> operator+(const hoge<T>& h1, const hoge<T>& h2);
template<typename T> class hoge {
private:
 T val;
friend hoge<T> operator+<T>(const hoge<T>& h1, const hoge<T>& h2);
}

としました。(ちと汚いが…)