加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 模板和专用模板是如何实现的

发布时间:2020-12-16 07:33:14 所属栏目:百科 来源:网络整理
导读:这是我不理解的代码 #includeiostreamusing namespace std;template typename T T calc(T,T) { cout "template calc" endl; }double calc(double,double) { cout "ordinary calc" endl; }template char calcchar(char,char) { cout "template specialisation
这是我不理解的代码

#include<iostream>

using namespace std;

template <typename T> 
T calc(T,T) { cout << "template calc" << endl; }

double calc(double,double) { cout << "ordinary calc" << endl; }

template <> 
char calc<char>(char,char) { cout << "template specialisation calc" << endl; }

int main() {

   int ival;
   double dval;
   float fd;

   calc(0,ival); // calls the generic calc(T,T)

   // the following all call calc(double,double)
   calc(0.25,dval);
   calc(0,fd);
   calc(0,'J');

   calc('I','J'); // calls calc(char,char)
}

有5个函数调用calc,所以我会根据它们的位置将它们称为1) – 5).

1)有道理. 0是整数,ival是整数,有意义的是调用calc(T,T).虽然我觉得我的理由是错误的.毕竟,它们都是双打的,所以如果调用calc(double,double),那也是有意义的.所以在这里寻求澄清.

2)没有戏剧,都是双打,叫钙(双,双).简单.

3)fd是一个浮点数.可以调用calc(T,T)或calc(double,double).因为1)导致对calc(T,T)的调用,我会假设同样会在这里保持,因为我们再次有一个param为0,但是,这会调用calc(double,double).所以这让我感到困惑,特别是这和1之间的区别

4)我的第一个想法是0是一个有效的字符,所以是’J’,所以它调用calc(char,char).它可以使用常见的整数类型调用calc(T,T).但是没有,两个都错了,它叫做calc(double,double).我对此非常困惑.对我毫无意义.

5)有道理,但只有我应用了与4)相同的逻辑,这在4)中是错误的,所以如果我要看到另一个使用模板的例子,我不确定应用什么逻辑.

所以寻找解释为什么这个程序做它的功能.

谢谢.

解决方法

首先,当您在源代码中写入文字“0”时,它的类型为“int”.在查找要调用的函数时,编译器会选择最匹配的函数.如果不可用,编译器将执行一些隐式类型转换以使其工作.

1)0和ival都是int

2)对于double和double,calc(double,double)完全匹配

3)对于int和float,找不到匹配,因此两者都转换为double

4)对于int和char,与3)相同

5)对于char和char,calc(char,char)完全匹配

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读