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

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

  •  
  •   linux40 Apr 15, 2015 1617 views
    This topic created in 4049 days ago, the information mentioned may be changed or developed.

    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 replies    2015-04-16 20:31:07 +08:00
    ryd994
        1
    ryd994  
       Apr 15, 2015 via Android
    没事学大佬乱用auto很好玩么?
    因为auto iter = s1.end();
    s1.end就是返回null,然后iter就被自动分配为void类型了。你再赋值,当然就有问题了。
    不要赋d1.end,直接把下一行放上来就没事了。不用auto也没事
    soli
        2
    soli  
       Apr 15, 2015   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  
       Apr 15, 2015
    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  
       Apr 15, 2015
    呃,又忘了怎么贴代码了。。。

    https://gist.github.com/dfea5971de9b38631e80
    soli
        5
    soli  
       Apr 15, 2015
    soli
        6
    soli  
       Apr 15, 2015
    原来需要把文件名带上 .cpp 才能语法高亮。
    linux40
        7
    linux40  
    OP
       Apr 15, 2015
    @ryd994 改成begin()还不是一样的,还有,我只想是举个例子,我是做一道要求使用迭代器和insert的习题时遇到的问题。。。
    linux40
        8
    linux40  
    OP
       Apr 15, 2015
    @soli 呃,gcc版本已4.9.2。。。
    slowman
        9
    slowman  
       Apr 15, 2015
    Heng
        10
    Heng  
       Apr 16, 2015
    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
       Apr 16, 2015
    @Heng
    @soli
    嗯嗯,这些还是知道的,书上有写。
    About     Help     Advertise     Blog     API     FAQ     Solana     2941 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 15:11 PVG 23:11 LAX 08:11 JFK 11:11
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86