模板函數的隱式(implicit)類型轉換, 涉及到模板參數(typename)的確定問題.
從int或double類型, 無法隱式轉換為模板類(template class)的類型, 因為無法確定模板參數類型(typename), 就無法確定建構函式的參數.
所以需要使模板函數, 與模板類擁有相同的參數類型(typename), 則需要成為模板類的友元(friend).
模板類的友元, 會隨著類的參數執行個體化, 而執行個體化參數類型, 從一個函數模板, 產生定製的函數, 即可以通過隱式類型轉換.
因為產生了定製的函數, 所以無法找到外部的模板類定義, 可以通過:
1. 直接在友元函數內部, 實現代碼(inline);
2. 在友元函數內部, 實現一個模板函數, 在把模板函數在外部實現.
代碼如下:
/* * test.cpp * * Created on: 2014.04.22 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> template<typename T> class Rational; template<typename T> const Rational<T> doMultiply (const Rational<T>& lhs, const Rational<T>& rhs); //有理數//更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/template<typename T> class Rational { /*friend const Rational<T> operator* (const Rational<T>& lhs, const Rational<T>& rhs) { return Rational<T>(lhs.numerator()*rhs.numerator(), lhs.denominator()*rhs.denominator()); } //方法1*/ friend const Rational<T> operator* (const Rational<T>& lhs, const Rational<T>& rhs) { return doMultiply(lhs, rhs); } //方法2 public: Rational(const T& numerator = 0, const T& denominator = 1) : m_n(numerator), m_d(denominator) {} const T numerator() const {return m_n;}; const T denominator() const {return m_d;}; const T value() {return (m_n/m_d);} private: T m_n; T m_d; }; template<typename T> const Rational<T> doMultiply (const Rational<T>& lhs, const Rational<T>& rhs) { return Rational<T>(lhs.numerator()*rhs.numerator(), lhs.denominator()*rhs.denominator()); } int main(void) { Rational<double> oneFourth(1, 4); Rational<double> result; result = oneFourth * 3.5; result = 3.5 * oneFourth; std::cout << "result = " << result.value() << std::endl; return 0; }
輸出:
result = 0.875
作者:csdn部落格 Spike_King