范型算法与模板参数推演

如下程序
int main(){
list<string> strList;
list<string>::iterator element;
strList.push_front("001");
strList.push_front("002");
replace(strList.begin(), strList.end(), "002", "123");
return 0;
}
是可以运行的
但是把
replace(strList.begin(), strList.end(), "002", "123");
改为
replace(strList.begin(), strList.end(), "002", "abc123");
就会有错误:
error C2782: 'void std::replace(_FwdIt,_FwdIt,const _Ty &,const _Ty &)' : template parameter '_Ty' is ambiguous
请问是为什么啊?
回复人:todototry(来csdn,学会扯淡了...) ( 五级(中级)) 信誉:1002007-5-23 13:55:28得分:20
 
 
?

"123"
"abc123"
====
长度需相同的
Top
 
回复人:todototry(来csdn,学会扯淡了...) ( 五级(中级)) 信誉:1002007-5-23 13:56:05得分:0
 
 
?

“abc”即可以,okokok
Top
 
回复人:liutp() ( 一级(初级)) 信誉:1002007-5-23 13:59:13得分:0
 
 
?

多谢todototry
那如果我想替换一个不同长度的字符串要怎么做?
Top
 
回复人:todototry(来csdn,学会扯淡了...) ( 五级(中级)) 信誉:1002007-5-23 14:06:19得分:0
 
 
?

你用string变量来传递即可
int main(){
list<string> strList;
list<string>::iterator element;
string str1 = "001";
string str2 = "002";
strList.push_front(str1);
strList.push_front(str2);
string str3 = "dsadsadsa";
replace(strList.begin(), strList.end(), str2, str3);
return 0;
}
Top
 
回复人:liutp() ( 一级(初级)) 信誉:1002007-05-23 14:08:28得分:0
 
 
?
多谢todototry
Top
 
回复人:classpatterns(一个2007毕业的小菜菜<闭关修炼ing>) ( 四级(中级)) 信誉:1002007-05-23 14:08:43得分:0
 
 
?
okok
Top
 
回复人:todototry(来csdn,学会扯淡了...) ( 五级(中级)) 信誉:1002007-05-23 14:14:25得分:0
 
 
?
愿意是这样的,因为这个replace算法是个模板,它模板参数类型的推演发生在使用replace算法的时候
replace(strList.begin(), strList.end(), "002", "123");
===========================
你这样使用的时候,由于后两个参数的模板参数类型是一致的,所以模板推延过程为这样:
看到“002”所以推延模板参数类型为char[4](因为字符串以‘/0’结尾,所以多用一个字符),它拿这个类型匹配"123",完全正确,所以可以执行

replace(strList.begin(), strList.end(), "002", "abc123");
=============================
这样调用的时候,“002”推演出模板参数类型为char[4],“abc123”推演出模板参数类型为char[7],编译器不知道哪个类型正确了

replace(strList.begin(), strList.end(), str2, str3);
==========================
这样调用之时,参数3,4推演出的模板参数类型均为string,所以可以正确执行

所以这个也提示了在使用GP范性的时候,尽量风格统一,使用string类型
之所以char *, const char *能够构造string对象,是为了兼容旧的风格,
风格一致之时,才会安全高效,stl使用okokok
Top
 
 

该问题已经结贴 ,得分记录: todototry (20)、
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值