g++ 使用 boost::algorithm:string:split 和 std::string 时初始化错误无效

g++ invalid initialization error using boost::algorithm:string:split and std::string

本文关键字:string 初始化 std 错误 无效 split 使用 boost algorithm g++      更新时间:2023-10-16

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

基本上,我想切掉一个字符串,其中感兴趣的子字符串用逗号分隔,并将它们推入字符串向量中。这会导致 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,我不知道为什么函数是这样设计的。对我来说似乎很奇怪,但你去吧。

相关文章: