关于模板的问题

funnyone 2010-09-25 10:41:02
今天看啦一章,很多不懂,\(^o^)/~

1.c++ primer p541

template<class t1,class t2,class t3> t1 sum(t2,t3);

为甚麽这样调用:long val=sum<long>(int,long);

而不是sum(int,long,long);呢?

2.p465

class small{ public:
small(int=0);
operator int() const{return val;};
private: string::size_type val;
};
这样写对不:
int i=int+0;

为甚麽以及为什麽的为甚麽













...全文
201 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
gules 2010-09-26
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 funnyone 的回复:]
问题是:

small(int=0);如果是构造函数,为甚麽不写small(string::size_type=0); 函数成员不是int的[/Quote]

呵呵,你这个问题问得我都不知道怎么表达,成员的类型是什么构造函的参数就必须是什么吗?这里int可以转换为string::size_type(实际上这是个unsigned int之类的)。
funnyone 2010-09-26
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 gules 的回复:]

small(int=0);
这不是错误,是正确的,表示只有一个int型的参数且默认值为0。正如我们写 f(int);是一样的。调用时,你可不给参数,也可以给一个参数。
另外,
small s; // 相当于调用small(0);
int i = s+0;
这个也没错,因为+运算符会对其左边的参数进行类型转换,恰好small中定义了int转换!一般而言,只有非成员函数的运算符才会对其第一……
[/Quote]


问题是:

small(int=0);如果是构造函数,为甚麽不写small(string::size_type=0); 函数成员不是int的
gules 2010-09-26
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 luoqi 的回复:]
int i=sum<long>(int,long);也可以的啊!
//我只不过是讨论这样的模板没意义
[/Quote]
可以啊,但你应该知道long类型隐式转换为int类型的结果吧?(看平台,可能溢出)
这个模板有意义,别只盯在整形上,如果是自定义的数据类型呢,如:
vector<string> vs = sum(list1, vs2);// 将list1中的元素与vs2中的元素合并返回到数组中
luoqi 2010-09-26
  • 打赏
  • 举报
回复
int i=sum<long>(int,long);也可以的啊!
//我只不过是讨论这样的模板没意义
gules 2010-09-26
  • 打赏
  • 举报
回复
关于函数模板,调用时函数会通过实参的数据类型来推导其模板参数,但这仅限于函数的形参;返回值类型是不会进行推导的,所以你必指定返回值类型的模板参数。
long val=sum<long>(int,long); // 返回值为long类型,不进行推导,所以必须指定sum<long>,形参则进行推导。
gules 2010-09-26
  • 打赏
  • 举报
回复
small(int=0);
这不是错误,是正确的,表示只有一个int型的参数且默认值为0。正如我们写 f(int);是一样的。调用时,你可不给参数,也可以给一个参数。
另外,
small s; // 相当于调用small(0);
int i = s+0;
这个也没错,因为+运算符会对其左边的参数进行类型转换,恰好small中定义了int转换!一般而言,只有非成员函数的运算符才会对其第一个参数(且只会对第一个参数)进行隐式类型转换,如果实参能转则调用之;不能则报错(无匹配的运算符函数重载)。
pengzhixi 2010-09-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 luoqi 的回复:]
引用 10 楼 pengzhixi 的回复:

sum<long>(int,long);//<long>这个是指定返回值类型,int,long是参数类型。


template<class T>
int sum(int i,long l){return i+l;}

sum<long>(1,2);//这个long有意义?
[/Quote]

这个long 的意义就是指定T的类型为long ,请看清楚LZ的原题
template<class t1,class t2,class t3> t1 sum(t2,t3);
funnyone 2010-09-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 luoqi 的回复:]

当然有问题s+0无法计算!
因为s没有重载+操作符
[/Quote]

可以s转化为int ,用加法
luoqi 2010-09-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 pengzhixi 的回复:]

sum<long>(int,long);//<long>这个是指定返回值类型,int,long是参数类型。
[/Quote]

template<class T>
int sum(int i,long l){return i+l;}

sum<long>(1,2);//这个long有意义?
pengzhixi 2010-09-25
  • 打赏
  • 举报
回复
sum<long>(int,long);//<long>这个是指定返回值类型,int,long是参数类型。
luoqi 2010-09-25
  • 打赏
  • 举报
回复
当然有问题s+0无法计算!
因为s没有重载+操作符
funnyone 2010-09-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 luoqi 的回复:]

int i=int+0;?
///这不是伪代码???
[/Quote]

写错啦:\(^o^)/~

small s;
int i=s+0;
luoqi 2010-09-25
  • 打赏
  • 举报
回复
int i=int+0;?
///这不是伪代码???
funnyone 2010-09-25
  • 打赏
  • 举报
回复
关键是

int i=int+0;?
funnyone 2010-09-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 luoqi 的回复:]

引用 3 楼 funnyone 的回复:


那个你理解为真确就可以啦,

关键是int i=int……


教程上写伪代码,而不声明这是伪代码????????
可以把它XXXXXXX了
[/Quote]

写成

class small{ public:
small(int m_size=0):size_type(m_size);
operator int() const{return val;};
private: string::size_type val;
};
这样写对不:
int i=int+0;

luoqi 2010-09-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 funnyone 的回复:]


那个你理解为真确就可以啦,

关键是int i=int……
[/Quote]

教程上写伪代码,而不声明这是伪代码????????
可以把它XXXXXXX了
funnyone 2010-09-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 luoqi 的回复:]

///
small(int=0);//这是印刷错误


还有,可能是缺省参数!!!!
如:
void func(int);//可以省略掉形参的
void func(int i=0);//缺省参数
//但我没有见过
void func(int=0);??????????
[/Quote]

那个你理解为真确就可以啦,

关键是int i=int+0; 那好像是伪代码
luoqi 2010-09-25
  • 打赏
  • 举报
回复
///
small(int=0);//这是印刷错误


还有,可能是缺省参数!!!!
如:
void func(int);//可以省略掉形参的
void func(int i=0);//缺省参数
//但我没有见过
void func(int=0);??????????
luoqi 2010-09-25
  • 打赏
  • 举报
回复
模板,就是模板,不是参数!

sum<long>(1,2);
说明这个模板的type是long,跟参数冒的关系!

///
small(int=0);//这是印刷错误

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧