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

2024-11-30 02:11:41
推荐回答(2个)
回答1:

编译器不会有问题, 应该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 &”

吓尿了.

回答2:

我用vs10上试验了,完全可以啊,估计你用的是6.0吧,6.0标准库支持不全。