V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
linux40
V2EX  ›  C

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

  •  
  •   linux40 · 2015-04-15 19:13:18 +08:00 · 1061 次点击
    这是一个创建于 3540 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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());
    ^*/

    11 条回复    2015-04-16 20:31:07 +08:00
    ryd994
        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也没事
    soli
        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
    soli
        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 迭代器类型,故而出错。
    soli
        4
    soli  
       2015-04-15 22:55:29 +08:00
    呃,又忘了怎么贴代码了。。。

    https://gist.github.com/dfea5971de9b38631e80
    soli
        5
    soli  
       2015-04-15 22:56:10 +08:00
    soli
        6
    soli  
       2015-04-15 23:02:52 +08:00
    原来需要把文件名带上 .cpp 才能语法高亮。
    linux40
        7
    linux40  
    OP
       2015-04-15 23:06:24 +08:00
    @ryd994 改成begin()还不是一样的,还有,我只想是举个例子,我是做一道要求使用迭代器和insert的习题时遇到的问题。。。
    linux40
        8
    linux40  
    OP
       2015-04-15 23:18:25 +08:00
    @soli 呃,gcc版本已4.9.2。。。
    1423
        9
    1423  
       2015-04-15 23:39:51 +08:00
    Heng
        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/
    linux40
        11
    linux40  
    OP
       2015-04-16 20:31:07 +08:00
    @Heng
    @soli
    嗯嗯,这些还是知道的,书上有写。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1174 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:15 · PVG 02:15 · LAX 10:15 · JFK 13:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.