zoukankan      html  css  js  c++  java
  • 关于Boost库的split函数在不同的编译器下的使用

    之前在写算法的时候使用VS2008,最近需要往CentOS上部署,需要把代码使用gcc编译。由于在代码中使用了大量的boost库,按理说是应该没有问题的。但是今天出现了一个很奇怪的问题,boost的split函数编译不过去。比如下面的代码片段。

    		vector<string> vStr;
    		split(vStr, vPicFiles[i].filename(), is_any_of("_."));

    上面的代码使用VS2008的编译器完全无压力,而是用GCC编译器就直接报错。错误信息如下:

    F:\BoostTest\BoostTest.cpp|165|error: no matching function for call to 'split(std::vector<std::basic_string<char> >&, boost::filesystem::basic_path<std::basic_string<char>, boost::filesystem::path_traits>::string_type, boost::algorithm::detail::is_any_ofF<char>)'|

    Google了N久,找到了一篇文章,地址在下面的参考资料里面。里面有段代码,如下:

    #include <boost/algorithm/string.hpp> 
    #include <string> 
    #include <vector> 
    
    std::string f() 
    { 
            return ""; 
    } 
    
    int main() 
    { 
            std::vector<std::string> v; 
            boost::split(v, f(), boost::is_any_of(",")); 
            return 0; 
    } 
    这段代码使用Gcc编译后的错误信息是:

    split_test.cpp: In function 'int main()': 
    split_test.cpp:13: error: invalid initialization of non-const 
    reference of type 'std::string&' from a temporary of type 
    'std::string' 
    /usr/include/boost/algorithm/string/split.hpp:143: error: in passing 
    argument 2 of 'SequenceSequenceT& 
    boost::algorithm::split(SequenceSequenceT&, RangeT&, PredicateT, 
    boost::algorithm::token_compress_mode_type) [with SequenceSequenceT = 
    std::vector<std::basic_string<char, std::char_traits<char>, 
    std::allocator<char> >, std::allocator<std::basic_string<char, 
    std::char_traits<char>, std::allocator<char> > > >, RangeT = 
    std::string, PredicateT = boost::algorithm::detail::is_any_ofF<char>]' 
    后面有位大牛指出了错误所在,他说:This is because f() is returning a std::string and this is being passed to the RangeT & argument in the split function. Due to C++ rules, performing the T -> T & conversion is invalid. Try defining f() as: 

    const std::string f() 
    { 
       return ""; 
    } 
    通过上面的信息,我们把程序稍微改造一下,就是对于split的参数,先用一个临时变量存起来,然后再使用split,如下:

    		string strFileName = pFile.filename();
    		vector<string> vStr;
    		split(vStr, strFileName, is_any_of("_."));
    
    然后再编译,OK,没有错误了。看来GCC是要比MS的编译器严格啊。


    参考资料

    1:http://boost.2283326.n4.nabble.com/no-matching-function-for-call-to-boost-algorithm-split-td2604230.html


  • 相关阅读:
    myeclipse自带客户端连接mysql数据库
    javaweb学习总结八(xml约束DTD)
    javaweb学习总结七(XML语言作用、语法)
    javaweb学习总结六(泛型)
    plsql常用快捷键
    javaweb学习总结五(内省、beanUtils工具包)
    javaweb学习总结四(反射技术)
    javaweb学习总结三(枚举)
    eclipse常用快捷键汇总
    plsql设置窗口默认格式
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6313971.html
Copyright © 2011-2022 走看看