关于C++的assign将一个list容器的所有元素赋值给一个vector容器的问题(C++ Primer第四版 284页习题9.28)

程序代码如下:#include<iostream>#include<list>#include<vector>#include<string>usingnamespace... 程序代码如下:
# include <iostream>
# include <list>
# include <vector>
# include <string>
using namespace std;

int main(void)
{
char *sa[] = {"Mary" , "Tom" , "Bob" , "Alice"};
list<char*> slist(sa , sa + 4);
vector<string> svec;
svec.assign(slist.begin() , slist.end());
for (list<char*>::iterator iter = slist.begin() ; iter != slist.end() ; iter++)
cout << *iter << " ";
cout << endl;
for (vector<string>::iterator ite = svec.begin() ; ite != svec.end() ; ite++)
cout << *ite << " ";
cout << endl;

return 0;
}

编译到这一行的时候出错:svec.assign(slist.begin() , slist.end());
给出的原因如下:

cannot convert parameter 1 from 'class std::list<char *,class std::allocator<char *> >::iterator' to 'const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > *'

后来在网上看见一个哥们儿说用push_back方法将list元素压入svec中,这倒是可以,将svec.assign(slist.begin() , slist.end())改为如下即可正常运行:
list<char*>::iterator i;
for(i = slist.begin() ; i != slist.end() ; i++)
svec.push_back(string(*i));
请问高手为啥svec.assign(slist.begin() , slist.end())这行会出错?...我感觉没错啊...
难道是编译器的问题?
展开
 我来答
reverse_walker
2013-06-14 · TA获得超过590个赞
知道小有建树答主
回答量:377
采纳率:0%
帮助的人:466万
展开全部
编译器不会有问题, 应该STL的问题
在我VC9.0上编译没什么问题.

执行svec.assign(slist.begin() , slist.end())的核心语句是
for (; _First != _Last; ++_Dest, ++_First)
_Al.construct(_Dest, *_First); // first等于list::iterator类型, 解开就等于char* p = "mary"

_Al.construct(_Dest, *_First);展开等于
::new (_Vptr) _T1(_Val); //_Val = char*类型 = "mary", _T1 = string类型

所以string( "mary" )完全是合法调用.

而你的编译器提示list::iterator无法转换成string*类型. 这实在让人费解,
我不相信你的STL会有类似string* p = list::iterator的间接操作.
是不是你STL文件被无意改过了.
比如删掉了*解引用操作符.
因为我删掉了*后, 我的编译器显式错误如下:
>d:\vc++\vc\include\memory(129) : error C2664: “std::allocator<_Ty>::construct”: 不能将参数 2 从“std::list<_Ty>::_Iterator<_Secure_validation>”转换为“const std::string &”

吓尿了.
追问
请问大哥我因该怎么修改?修改Include文件夹里的list和string文件?
追答
我是说万一, 你没打开过STL文件就不要去修改.
还是重装下编程环境吧.
欢乐多Ek
2013-06-14 · TA获得超过478个赞
知道小有建树答主
回答量:477
采纳率:0%
帮助的人:418万
展开全部
我用vs10上试验了,完全可以啊,估计你用的是6.0吧,6.0标准库支持不全。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式