正文

[笔记]template class的隐式转化2007-12-30 18:29:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/rickone/31664.html

分享到:

[Effective C++ 3rd 条款46]

有理数类class Rational是一个template<class T>,T的意思是做为表示分子和分母的数值类型.为了让它能够有相乘运算,可以写个函数

template<class T>
const Rational<T> operator*(const Rational<T> &l,const Rational<T> &r)
{ ... }

为了让它能够自动进行隐式转化,因为它有一个non-explicit的构造函数

template<class T>
class Rational
{
  Rational(const T& n = 0, const T& d = 1){...}
};

所以希望这样的代码可以通过编译:

Rational<int> onehalf(1,2);
Rational<int> result=onehalf * 2;

因为那个operator*函数是一个模板函数,它并不等同于Rational<int>具现化后的那个函数,所以不能做隐式转化,实际上它不能通过参数推导.

解决方法是将该函数在template<class T>class Rational{}内申明为friend,因为在编译器看到Rational<int>的时候,就将Rational<int>具现出来,所以那个friend申明会爆光.

template<class T>
class Rational
{
  ...
  friend const Rational<T> operator*(...);
};

然而,还是会引来连接错误,因为爆光的只是申明,对于那个外面的模板函数同样需要有机会具现,才能连接成功.最终,只能再加上内联,让函数的定义在那里爆光.

template<class T>
class Rational
{
  ...
  friend const Rational<T> operator*(...){...}
};

记住,参数推导的时候不会做隐式参数转化.

阅读(3257) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册