模板函數的隱式(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); //有理數 //