g++ 使用 boost::algorithm:string:split 和 std::string 时初始化错误无效
g++ invalid initialization error using boost::algorithm:string:split and std::string
我正在将一些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::string
或const std::string&
。这意味着您必须将.substr
的结果存储在中间变量中,然后将该变量传递给boost::algorithm::split
。无论如何,代码会更清晰。
FWIW,我不知道为什么函数是这样设计的。对我来说似乎很奇怪,但你去吧。
相关文章:
- 为什么 std::string s = "123" 当不涉及副本时被视为复制初始化?
- 初始化有关Google C 样式指南的静态字符串(C-Type或STD :: String)
- 如何使用<string>初始值设定项列表初始化unordered_map<字符串、unordered_set>成员?
- 消除 std::vector<std::string 的列表初始化的歧义>
- 错误 C2440:"正在初始化":无法从"std::string"转换为"双 *[]"
- 初始化不能从const char [3]转换为std :: string *
- 类型为'std::string&的非常量引用的初始化无效,并且从类型为'std::basic_string<char>的右值
- 如何初始化结构字段 std::map<std::string, std::string>称为参数
- <string> 使用双花括号初始化向量
- 从相同的硬编码字符串文字初始化std::string和std::wstring
- 使用双大括号的矢量初始化:std::string vs int
- 初始化 std::string& 的私有类变量
- 特征库 --> 使用文件或现有 std::vector<string> content (c++) 中的数据初始化矩阵
- 正在使用std::string初始化istream属性
- 当数据以二进制零结尾时,如何初始化 std::string
- g++ 使用 boost::algorithm:string:split 和 std::string 时初始化错误无效
- 如何使用包含空值的字符*初始化 std::string
- 类型为 std::String&- 的非常量引用的初始化无效 - 如何删除
- 错误:无法在初始化中将"std::string {aka std::basic_string<char>}"转换为"char*"
- 错误:无法使用初始值设定项列表初始化非聚合类型 'vector<string>'