template以及operator*的正确用法

来源:互联网 发布:成都专业网络推广公司 编辑:程序博客网 时间:2024/05/11 23:06

这是看《Effective c++》时在VS上玩的代码。

#include <iostream>using namespace std;template<typename T>class Rational{public:Rational(const T& numerator =0,const T& denominator = 1);const T numerator() const;//不暴露私有变量给调用者修改const T denominator() const;//为了让类型转换可能发生于所有实参身上,需要non-member函数;//为了让这个函数被自动具现化,需要将它声明在class内部friend const Rational operator*(const Rational& lhs,const Rational& rhs){return Rational(lhs.numerator()*rhs.numerator(),lhs.denominator()*rhs.denominator());}/*如果类内提供声明:friend const Rational operator*(const Rational& lhs,const Rational& rhs);然后在外部提供定义式:template<typename T>const Rational<T> operator*(const Rational<T>& lhs,const Rational<T>& rhs){return Rational(lhs.numerator()*rhs.numerator(),lhs.denominator()*rhs.denominator());}可是链接时不成功:无法解析的外部符号"class Rational<int> const __cdecl operator*(class Rational<int> const &,class Rational<int> const &)"*/ void print(){cout<<numerator()<<"/"<<denominator()<<endl;}private:T num;T deno;};template<typename T>Rational<T>::Rational(const T& numerator,const T& denominator){num = numerator;deno = denominator;}template<typename T>const T Rational<T>::numerator()const {return num;}template<typename T>const T Rational<T>::denominator()const {return deno;}int main(){Rational<int> a (2,7);Rational<int> b = a*2;//2被转换成Rational(2),分子赋值为2,分母没值默认为1b.print();Rational<int>c =a*a;c.print();return 0;}


原创粉丝点击