【发布时间】:2016-03-15 21:07:44
【问题描述】:
我正在将一些 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(
^
【问题讨论】:
-
很清楚。 Boost 想要一个非常量引用作为它的第二个参数(我想,它会修改它),并且你不能将非常量引用绑定到临时的。
-
@SergeyA:我永远无法弄清楚为什么它需要一个非常量 ref 或者它为什么要修改拆分函数的输入。
-
@BarryTheHatchet,也不知道,但是:
This function is equivalent to C strtok(来自 Boost),strtok修改了它的论点。可能有人只是复制行为?