无法创建basic_vectorstream <std :: vector <char>&gt;在Boost 1.55+

时间:2015-08-01 05:05:12

标签: boost

从Boost 1.54移动到1.55我现在在编译期间遇到此错误(VS2010):

void GzipDecompression::Decompress(const unsigned char * src, int length)
{
  if(src)
  {
      // Create an input-stream source for the data buffer so we can used the boost filtering buffer
      std::ifstream inputstream;
      typedef boost::iostreams::basic_array_source<char> Device;
      boost::iostreams::stream_buffer<Device> buffer((char *)src, length);

      // Inflate using the GZIP filter
      filtering_streambuf<input> in;
      in.push(gzip_decompressor());
      in.push(buffer);

      // Get the result into a vector
      boost::interprocess::basic_vectorstream<std::vector<char>> vectorStream;
      copy(in, vectorStream);
      std::vector<char> output(vectorStream.vector()); 
  }
}

error C2243: 'type cast' : conversion from 'boost::interprocess::basic_vectorstream<CharVector> *' to 'volatile const std::basic_streambuf<_Elem,_Traits> *' exists, but is inaccessible    c:\boost\boost_1_55_0\boost\iostreams\traits.hpp    57  1   

现在看来现在失败了:

boost::interprocess::basic_vectorstream<std::vector<char>> vectorStream;

发生了什么变化,所以这不能编译?

回复后更新:我已尝试将输出更改为:

  std::istream instream(&in);

  typedef std::istream_iterator<char> istream_iterator;
  typedef std::ostream_iterator<char> ostream_iterator;

  std::vector<char> output;
  std::copy(istream_iterator(instream), istream_iterator(), std::back_inserter(output));

但输出不同。我是否需要冲洗流或什么?

Update2:显然istream_iterator剥离CR LF等。这是我的工作函数

void GzipDecompression::Decompress(const unsigned char * src, int length)
{
  if(src)
  {
      // Create an input-stream source for the data buffer so we can used the boost filtering buffer
      std::ifstream inputstream;
      typedef boost::iostreams::basic_array_source<char> Device;
      boost::iostreams::stream_buffer<Device> buffer((char *)src, length);

      // Inflate using the GZIP filter
      filtering_streambuf<input> in;
      in.push(gzip_decompressor());
      in.push(buffer);

      // Get the result into a vector
      std::istream instream(&in);

      typedef std::istreambuf_iterator<char> istreambuf_iterator;


      std::vector<char> output;
      std::copy(istreambuf_iterator(instream), istreambuf_iterator(), std::back_inserter(output));

  }
}

由于

1 个答案:

答案 0 :(得分:1)

当然,错误不会出现在你提到的那一行。相反,它是在copy_impl的模板实例化中生成的。问题似乎是Boost Iostreams试图明智地检测人们何时使用“原始缓冲区”作为设备/流。

问题在于,Interprocess流实现(私有地)继承了它的缓冲区类,因此,这会混淆检测,因为转换为base似乎可用但不可访问。

这可以在GCC和VS2013更新4中重现,并且所有都使用Boost 1_58_0。因此,可以向Boost开发人员报告错误。我建议它是Boost Interprocess实现中的一个弱点,尽管Boost Iostreams开发人员可能有兴趣在私有基类存在的情况下使其过载选择更加健壮......

同时,考虑使用一个简单的boost::iostreams::array_sinkboost::iostreams::back_insert_device(IIRC),它几乎可以保证与Boost Iostreams一起发挥作用,并实现相同的目标。