模板函数须要类型转换时使用友元(friend)模板函数

本文地址: http://blog.csdn.net/caroline_wendy/article/details/24357301

非模板函数參考: http://blog.csdn.net/caroline_wendy/article/details/24309293

模板函数隐式(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);//有理数
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

C++ - 模板函数须要类型转换时使用友元(friend)模板函数相关推荐

  1. 需要类型转换时请为模板定义非成员函数——条款46

    条款24讨论过为什么唯有non-member函数才有能力"在所有实参身上实施隐式类型转换",该条款并以Rational class的operator*函数为例.我强烈建议你继续看下 ...

  2. 条款46:需要类型转换的时候请为模板定义非成员函数

    看看下面这个例子: 1 template<typename T> 2 class Rational{ 3 public: 4 Rational(const T & numerato ...

  3. 不存在从node到node*的适当转换函数_C++中参数需要类型转换,请不要用成员函数...

    点蓝色字关注"CurryCoder的程序人生" 微信公众号:CurryCoder的程序人生 欢迎关注我,一起学习,一起进步! 1.问题的引入 C++支持隐式类型转换,但通常情况下是 ...

  4. GBase 8c 函数和操作符 - 类型转换函数 之 类型转换函数

    cash_words(money) 描述:类型转换函数,将money转换成text. 示例: gbase=# SELECT cash_words('1.23'); cash_words ------- ...

  5. c语言函数参数类型检查,内联函数在编译时是否做参数类型检查?

    先说宏和函数的区别: 1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型. 2. 宏的参数替换是不经计算而直接处 ...

  6. c++ cstring 转换 char_【揭秘】C语言类型转换时发生了什么?

    ID:技术让梦想更伟大 作者:李肖遥 [揭秘]C语言类型转换时发生了什么? 在C语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统,我们常用的算术类型包括两种类型:整数类型和浮点类型. ...

  7. mysql 聚合函数内比较运算符_关于常用 MYSQL 聚合函数,其他函数 ,类型转换,运算符 总结...

    /* 关于MYSQL 聚合函数,其他函数 ,类型转换,运算符 总结,*/ -- 1 运算符优先级  /* 12.1.1. 操作符优先级 以下列表显示了操作符优先级的由低到高的顺序.排列在同一行的操作符 ...

  8. c语言的point函数,C语言中friend友元函数详细解析

    C语言中friend友元函数详细解析 友元函数是可以直接访问类的私有成员的非成员函数.它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字frien ...

  9. 类型和原生函数及类型转换(一)

    一.内置类型: 空值:null 未定义:undefined 布尔值:boolean 数字:number 字符串:string 对象:object 符号:symbol(ES6新增) 1.null类型的值 ...

最新文章

  1. 【Timbre,Amplitude,Pitch】声音的基本属性
  2. Exact跻身全球发展最快的云企业行列
  3. 经典算法题每日演练——第十九题 双端队列
  4. python判断sqlite连接状态_python3 自动识别usb连接状态,即对usb重连的判断方法
  5. 数据库保护(数据库备份)Sql Server2012 图形界面操作
  6. 显卡A卡和N卡有什么区别
  7. 实例39:python
  8. Linux学习笔记(三)
  9. 【写法规范】-- 设计请求返回接口与封装
  10. iptables之NAT
  11. 浏览器兼容console对象的简要解决方案
  12. tensor backward_Pytorch中的backward函数
  13. 读取Apache访问日志,查看每一个独立客户端连接获得的字节数
  14. c语言static知识点,C语言知识点集锦
  15. 数据类型选方法【SPSS 073期】
  16. ​【预测模型】基于粒子群算法优化最小二乘支持向量机实现数据分类matlab代码
  17. 推荐 System Repair Engineer(SREng)2.4.12.806 版本
  18. Excel修改默认分页符(仅仅在特定行后可插入分页符)
  19. 使用近场探头和电流探头进行EMI干扰排查
  20. 福大软工1816 · 第四次作业 - 团队展示

热门文章

  1. [SQL] Query mystore start [ERR] 1005 - Can't create table 'mystore.admin' (errno: 150)
  2. 老版本fortran语言 内存无效_面向科学计算的高性能动态编程语言 Julia
  3. PDF转换器安装教程
  4. 云服务器系统重装为windows,并进行文件传输
  5. 30 多年的软件经验,总结出 10 个编写出更好代码的技巧
  6. memkind版本查看_QQ 20周年来啦!扫码查看你的回忆
  7. linux 配置DNS正反区域,Linux基础服务_DNS原理以及正反向DNS配置
  8. 安全设置不许可html,快捷指令提示安全性设置不允许不信任怎么办_安全性设置不允许不信任解决办法_咖绿茵手游站...
  9. 学习SOX(1) 在VC中编译
  10. AI理论知识整理(10)-向量空间与矩阵(1)