我的代码中有以下几行:
std::vector<std::string> lines;
boost::split(lines, output, boost::is_any_of("\n"));
output
是const std::string
。
当我编译时,我收到一个错误:
error: implicit conversion changes signedness: 'typename range_difference<iterator_range<const char *> >::type' (aka 'long') to 'std::size_t' (aka 'unsigned long') [-Werror,-Wsign-conversion]
std::size_t Size=::boost::distance(Range);
这源于
boost::split(lines, output, boost::is_any_of("\n"));
^
看起来好像是内部输入错误? 有没有人遇到过这个?
注意:使用gcc版本5.3.1 20160406(Red Hat 5.3.1-6)进行编译,设置大多数警告标志和-Werror。
注2:正如@sehe所示,这确实是一个提升问题。 所以让我改变一个问题 - 有没有人知道解决方法呢?
谢谢!
答案 0 :(得分:1)
转载问题
https://wandbox.org/permlink/LIf0wzUPQxrz7pik(GCC)和https://wandbox.org/permlink/BofswARbx1BpVE6H(Clang)
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/predicate.hpp>
#include <boost/algorithm/string.hpp>
#include <vector>
#include <string>
int main() {
std::string output;
std::vector<std::string> lines;
boost::split(lines, output, boost::is_any_of("\n"));
}
这应该报告给Boost算法的维护者(参见boost邮件列表或https://svn.boost.org/trac10/query?status=assigned&status=new&status=reopened&component=string_algo&col=id&col=summary&col=status&col=owner&col=type&col=milestone&order=priority)
答案 1 :(得分:0)
看到周围没有关于这个问题的更多活动,我将结束这一点,说是 - 这是一个提升问题。用@sehe的MCVE很容易复制。 显然使用严格警告和Werror标志来编译boost是不可能的。
根据我的解决方法,我有一个相当简单的用例,我已经实现了我自己的,简单的分割版本
inline std::vector<std::string> Split(const std::string &str, char delim)
{
std::vector<std::string> out;
std::stringstream ss(str);
std::string item;
while (std::getline(ss, item, delim)) {
out.push_back(item);
}
return out;
}