c++ 初学者问一个关于 string.insert(iter, args)的问题?

2015-04-15 19:13:18 +08:00
 linux40

include <string>

int main()
{
std::string s1("mark "), s2("liu");
auto iter = s1.end();
iter = s1.insert(s1.end(), s2.begin(), s2.end());
return 0;
}
/g++ -std=c++11 -c /home/mark/test/p9/test.cc -o /home/mark/test/p9/test.o
/home/mark/test/p9/test.cc: 在函数‘int main()’中:
/home/mark/test/p9/test.cc:6:10: 错误:no match for ‘operator=’ (operand types are ‘gnu_cxx::normal_iterator<char
, std::basic_string<char> >’ and ‘void’)
iter = s1.insert(s1.end(), s2.begin(), s2.end());
^*/

1038 次点击
所在节点    C
11 条回复
ryd994
2015-04-15 21:49:53 +08:00
没事学大佬乱用auto很好玩么?
因为auto iter = s1.end();
s1.end就是返回null,然后iter就被自动分配为void类型了。你再赋值,当然就有问题了。
不要赋d1.end,直接把下一行放上来就没事了。不用auto也没事
soli
2015-04-15 22:10:28 +08:00
用 clang 可以编译。

> g++ -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.3.0
Thread model: posix
soli
2015-04-15 22:52:52 +08:00
https://gist.github.com/dfea5971de9b38631e80.git

clang 的结果是:

iter is a NSt3__111__wrap_iterIPcEE
void is a v
iter1 is a NSt3__111__wrap_iterIPcEE


g++ 的结果是(删除后面两行代码):


iter is a N9__gnu_cxx17__normal_iteratorIPcSsEE
void is a v

所以,iter 并不是被定义成 void ,而是 string 的迭代器。

看下面这个链接:

http://en.cppreference.com/w/cpp/string/basic_string/insert

从 c++ 11 开始,返回 void 的 insert 应该已经被返回 iterator 的 insert 取代了。

最终结论就是,g++ 对 c++ 11 的支持还是不够好。它还在使用返回 void 的 insert,而 void 无法类型转换成 iter 被定义成的 string 迭代器类型,故而出错。
soli
2015-04-15 22:55:29 +08:00
呃,又忘了怎么贴代码了。。。

https://gist.github.com/dfea5971de9b38631e80
soli
2015-04-15 22:56:10 +08:00
soli
2015-04-15 23:02:52 +08:00
原来需要把文件名带上 .cpp 才能语法高亮。
linux40
2015-04-15 23:06:24 +08:00
@ryd994 改成begin()还不是一样的,还有,我只想是举个例子,我是做一道要求使用迭代器和insert的习题时遇到的问题。。。
linux40
2015-04-15 23:18:25 +08:00
@soli 呃,gcc版本已4.9.2。。。
1423
2015-04-15 23:39:51 +08:00
Heng
2015-04-16 09:24:11 +08:00
C++ 98: template <class InputIterator>
void insert (iterator p, InputIterator first, InputIterator last);
C++ 11:template <class InputIterator>
iterator insert (iterator p, InputIterator first, InputIterator last);

http://www.cplusplus.com/reference/string/string/insert/
linux40
2015-04-16 20:31:07 +08:00
@Heng
@soli
嗯嗯,这些还是知道的,书上有写。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/183956

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX