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());
^*/
1
ryd994 2015-04-15 21:49:53 +08:00 via Android
没事学大佬乱用auto很好玩么?
因为auto iter = s1.end(); s1.end就是返回null,然后iter就被自动分配为void类型了。你再赋值,当然就有问题了。 不要赋d1.end,直接把下一行放上来就没事了。不用auto也没事 |
2
soli 2015-04-15 22:10:28 +08:00 1
用 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 |
3
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 迭代器类型,故而出错。 |
4
soli 2015-04-15 22:55:29 +08:00
|
5
soli 2015-04-15 22:56:10 +08:00
|
6
soli 2015-04-15 23:02:52 +08:00
原来需要把文件名带上 .cpp 才能语法高亮。
|
7
linux40 OP @ryd994 改成begin()还不是一样的,还有,我只想是举个例子,我是做一道要求使用迭代器和insert的习题时遇到的问题。。。
|
9
1423 2015-04-15 23:39:51 +08:00
|
10
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/ |