`

Item 46 模板需要类型转换的时候

阅读更多

把Item 24的例子改成模板:

定义operator*为非成员函数是为了支持混合运算。可是上面的代码却编译不过。为什么?
问题出在模板参数推导。
对于operator*来说,编译器只有推导出了T的类型,才能实例化该函数;然后编译器才能找到该函数;再然后调用该函数去处理两个操作数。
可是,编译器看着2这个数,迷惑了:如何从2推导出Rational<T>的T来呢?
编译器在着手推导T的时候,是不会去考虑使用隐式类型转换,把2变成Rational<int>,然后推导出int来的。
C++规定,隐式类型转换只发生在函数调用的时候。而在模板参数推导的时候,函数都还没有被建立出来!

C++是利用friend来解决这个问题的:

1> 用friend关键字
2> 把operator*的实现放到模板类的声明里,变成内联函数
然后才能编译、链接。

有时,要内联的函数体会很大,超过编译器的限制。此时会另外加一层:

分享到:
评论

相关推荐

    Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)

    数据结构为数组中包含对象–树形结构,用Vue组件的写法实现以下的效果: ...本文为用Vue实现方式,... &lt;table v-for=item v-bind:list=item&gt; 组件模板代码 &lt;script type=text/x-template id=table-component-tem

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     16.2.1 类型转换与模板类型参数 601  16.2.2 函数模板显式实参 603  16.2.3 尾置返回类型与类型转换 604  16.2.4 函数指针和实参推断 607  16.2.5 模板实参推断和引用 608  16.2.6 理解std::move 610  16.2....

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     16.2.1 类型转换与模板类型参数 601  16.2.2 函数模板显式实参 603  16.2.3 尾置返回类型与类型转换 604  16.2.4 函数指针和实参推断 607  16.2.5 模板实参推断和引用 608  16.2.6 理解std::move 610  16.2....

    C++ Primer第四版【中文高清扫描版】.pdf

    5.12.5 何时需要强制类型转换 158 5.12.6 命名的强制类型转换 158 5.12.7 旧式强制类型转换 160 小结 161 术语 162 第6章 语句 165 6.1 简单语句 166 6.2 声明语句 167 6.3 复合语句(块) 167 6.4 语句作用域 168 ...

    ribs:用于React的模板生成器

    用于无状态React组件的模板生成器 请勿在生产中使用! 真的吗? 是的,您只需要编写一个简单的文件,然后完成! 如何使用? 冷杉高高在上! $ sudo npm install -g ribs-lang 那么您就可以使用它了, 现在您可以...

    TRichView 15.1 FS

    从13.2版本开始,项目标签是字符串(Unicode for Delphi 2009或更高,ANSI老版本的Delphi),从整数到PChar无需类型转换! 64-bit 32-bit 和 64-bit编译器均支持RAD Studio XE2+。 注意: TRVOfficeConverter 可以...

    ASP.NET程序中常用的三十三种代码.txt

    回车转换成Tab  if (event.keyCode==13 && event.srcElement.type!=’button’ && event.srcElement.type! =’submit’ && event.srcElement.type!=’reset’ && event.srcElement.type!=’’&& event.srcElement...

    json2text:从 JSON 模板生成自由格式文本

    全局安装包: npm install json2text -g工具j2t [EXTENSION] : 编译模板j2n FILE : 从 FILE 生成模板存根j2f FILE [EXTENSION] :将_text字段从 FILE 转换为_file字段。如何使用示例1.定义模板元素创建扩展名为.j2....

    bassdrum:带有preact和rxjs的React型,类型安全的组件

    转换后的state将传递到您的JSX模板,并使用preact进行呈现。 interface Props { items : Item [ ] ; } interface State { items : Item [ ] ; count : number ; itemsPerPage : number ; } const AppFn : ...

    freemarker语法完整版

    &lt;#if item = "spring"&gt;&lt;#break&gt;&lt;/#if&gt; ... &lt;/#list&gt; &lt;#list sequence as item&gt; ... &lt;#if item = "spring"&gt;&lt;#break&gt;&lt;/#if&gt; ... 关键字 item_index:是list当前值的下标 item_has_next:判断list是否还有值 ...

    spark-to-ejs:Spark到EJS转换器脚本

    #Spark到EJS这是一个gulp项目,使用了一些很棒的库(例如cheerio和ejs-mate)将spark模板转换为ejs。 到目前为止,该项目已转换了spark标签###一些示例:### If SPARK &lt; if xss=removed xss=removed&gt; &lt; div&gt;content...

    freemarker总结

    其它的运行符可以作用于数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替&gt;会有更好的效果,因为 FreeMarker会把&gt;解释成FTL标签的结束字符,当然,也可以使用括号来避免这种情况,如:(x&gt;y)&gt; ...

    一个适合新手学习的电商项目

    tb_item_param商品规格参数模板表(id,item_id,param_data,created,updated) tb_order订单表(payment,payment_type,post_fee,status,create_time,update_time,payment_time,consign_time,end_time,close_time,...

    cpp11Practice:“有效的现代C ++”书的练习

    条目9:类型别名优先使用别名(使用)声明而不是typedefs typedef不支持模板。 项目10:范围内的枚举优先于作用域枚举而不是无作用域枚举枚举中的原始类型无法精炼无命名污染无隐式转换可以向前声明项目11:删除的...

    vue语法.rar

    语法:v-for="item in 集合" 8、v-on 作用:对页面中的事件进行绑定 语法:v-on:事件类型 = '监听器' 缩写@事件类型='监听器' 四、Vue常用的组件使用 组件是vue.js中一个非常强大的功能,可以扩展HTML...

    ASP.NET常用代码

    13.回车转换成Tab if(event.keyCode==13 && event.srcElement.type!='button' && event.srcElement.type!='submit' && event.srcElement.type!='reset' && event.srcElement.type!=''&& event.srcElement.type!='...

    BIWEB WMS PHP开源企业建站系统 v5.8.5.rar

    现推出中英文双语版,并可以完美支持中文繁简转换。 该系统需要PHP5以上版本,并要开启PDO和PDO_MYSQL组件,否则无法使用。 BIWEB V5.8.5启用了新的底层框架,共享内存缓存的应用,是新底层的一大特色,大家可以下载...

    ChineseFramework大型WEB应用框架程序

    技术特点及优势: 1. 框架没有和实现混在一起. 我发这个里面的实现只是一个例子.... 2.... 恐怕要改的也不在少数.... (对返回给UI层的数据进行转换)和untransData(对入库数据根据需要变换)能力。

    C++MFC教程

    而32位的系统中每一运行的程序都会有一个消息队列,所以系统可以在多个消息队列中转换而不必等待当前程序完成消息处理就可以得到控制权。这种多任务系统就称为抢先式的多任务系统。Windows95/NT就是这种系统。 1.3 ...

    funcoeszz.github.io:ZZ Functions网站,托管在GitHub Pages

    是构建网站,将Markdown文件转换为HTML并将模板应用于所有页面的工具。 在模板以及Markdown和HTML页面中,可以在必要时使用一种称为的简单语言来制作循环,条件和过滤器。 标签是{% … %}用于命令, {{ … }}用于...

Global site tag (gtag.js) - Google Analytics