问题提出: template<typename T> class Rational{ public: Rational(const T& numberator = 0, const T& denominator = 1); const T numerator()const; const T denominator()const; ... }; template<typename T> const Rational<T> operator*(const Rational<T>& left_handle_side, const Rational<T>& right_handle_side ); Rational<int> one_half( 1, 2 ); Rational<int> result = one_half * 2; //compile error. 解决问题: template<typename T> class Rational; template<typename T> const Rational<T> doMultiply(const Rational<T>& left_handle_side, const Rational<T>& right_handle_side); template<typename T> class Rational{ public: ... friend const Rational<T> operator*(const Rational<T>& left_handle_side, const Rational<T>& right_handle_side){ return doMultiply( left_handle_side, right_handle_side ); } ... };