Boost的is_any_of导致编译警告?

时间:2017-07-20 09:51:09

标签: c++ boost

我的代码中有以下几行:

std::vector<std::string> lines;
boost::split(lines, output, boost::is_any_of("\n"));

outputconst 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所示,这确实是一个提升问题。 所以让我改变一个问题 - 有没有人知道解决方法呢?

谢谢!

2 个答案:

答案 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;
}