條款46:需要類型轉換時請爲模板定義非成員函數

/*條款46:需要類型轉換時請爲模板定義非成員函數*/
#include<iostream>
using namespace std;
template<typename T>
class Rational{
public:
	Rational(const T&numerator=0,const T&denominator=1):a(numerator),b(denominator){
			
	}
	const T numerator()const{
		return a;
	}
	const T denominator()const{
		return b;	
	}
	//..
friend const Rational<T>/*加不加<T>一樣*/ operator*(const Rational&lhs,const Rational&rhs){
	return Rational(lhs.numerator()*rhs.numerator(),lhs.denominator()*rhs.denominator());
	}//把它非成員放在類內聲明緩和了模板參數推導時的隱式推斷,讓編譯器在類的具現化時得到T,但在這裏我們也必須履行聲明帶來的額外條件,要去定義它,儘管它是非成員函數,這樣就不會再報錯了
	friend ostream &operator<<(ostream&os,const Rational&rhs){
		return os<<rhs.a<<'/'<<rhs.b<<endl;
	}
private:
	T a;
	T b;
};
template<typename T>
ostream &operator<<(ostream&os,const Rational<T>&rhs);
template<typename T>
const Rational<T> operator*(const Rational<T>&lhs,const Rational<T>&rhs);


int main(){
	Rational<int> oneHalf(1,2);		
	Rational<int>result = oneHalf*2;//如果是非模板類型可以通過,因爲模板參數的推導不再允許有隱式推導
	cout<<result;
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章