我正在将一些C++代码从Windows移植到Linux(最终是OSX)。由于Windows不合规,会产生大量的C++问题。我似乎已经克服了这一点,但是现在面临着一个问题。

基本上,我想切成一个字符串,其中感兴趣的子字符串用逗号分隔,然后将它们推到字符串 vector 中。这会导致g++错误,但可以很好地与Visual Studio一起编译

该程序准确地说明了这个问题:

#include <boost/algorithm/string.hpp>
#include <string>
#include <vector>

int main (void) {


  std::vector<std::string> str_vec;
  std::string str_to_split = "this,is,the,string,to,split";

  boost::algorithm::split(str_vec,
                          str_to_split.substr(1, str_to_split.size()-2),
                          boost::algorithm::is_any_of(","),
                          boost::algorithm::token_compress_on);


  return 0;
}

我要编译:>> g++ -o foo foo.cpp
这是我的终端输出:
foo.cpp: In function 'int main()':
foo.cpp:11:54: error: invalid initialization of non-const reference type 'std::basic_string<char>&' from an rvalue of type'std::basic_string<char>'
   boost::algorithm::split(str_vec,str_to_split.substr(1, str_to_split.size()-2),boost::algorithm::is_an
                                                      ^
In file included from /usr/include/boost/algorithm/string.hpp:23:0,
                 from foo.cpp:1:
/usr/include/boost/algorithm/string/split.hpp:140:35: note:   initializing argument 2 of 'equenceSequenceT& boost::algorithm::split(SequenceSequenceT&, RangeT&, PredicateT, boost::algorithm::token_compress_mode_type) [with SequenceSequenceT = std::vector<std::basic_string<char> >; RangeT = std::basic_string<char>; PredicateT = boost::algorithm::detail::is_any_ofF<char>]'
         inline SequenceSequenceT& split(
                               ^

最佳答案

此函数采用std::string&而不是std::stringconst std::string&。这意味着您必须将.substr的结果存储在中间变量中,然后将变量传递给boost::algorithm::split。无论如何,这将是更清晰的代码。

FWIW,我不知道为什么这样设计功能。对我来说似乎很奇怪,但是您去了。

关于c++ - 使用boost::algorithm:string:split和std::string的g++无效初始化错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36022177/

10-11 23:00
查看更多