повысить zlib проблема

У меня проблема с библиотеками zlib в boost под VS 2010. Я собрал библиотеки, и в папке boost/stage/lib были сгенерированы соответствующие dll/libs. Я добавил .dll в папку отладки моей программы и связал ее с соответствующей .lib.

Но у меня возникают проблемы, когда я действительно пытаюсь использовать потоки zlib. Вот пример:

#include <cstring>
#include <string>
#include <iostream>
#include <boost\iostreams\filter\gzip.hpp>
#include <boost\iostreams\filtering_streambuf.hpp>
#include <boost\iostreams\copy.hpp>
std::string DecompressString(const std::string &compressedString)
{
    boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
    in.push(boost::iostreams::zlib_decompressor());
    in.push(compressedString);
    std::string retString = "";

    copy(in, retString);
    return retString;
}



when I try to compile thise though, I get multiple errors including:
error C2039: 'char_type' : is not a member of 'std::basic_string<_Elem,_Traits,_Ax>'    c:\program files (x86)\boost\boost_1_46_0\boost\iostreams\traits.hpp
error C2208: 'boost::type' : no members defined using this type c:\program files (x86)\boost\boost_1_46_0\boost\iostreams\traits.hpp
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   c:\program files (x86)\boost\boost_1_46_0\boost\iostreams\traits.hpp

Если я изменю свой код на следующее:

std::string DecompressString(const std::string &compressedString)
{

    boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
    in.push(boost::iostreams::zlib_decompressor());
    std::string retString = "";
    return retString;

}

Он компилируется, то есть проблема связана с in.push для сжатой строки и копией в retString. Я делаю что-то неправильно? Разве мне не разрешено использовать такие строки?

заранее спасибо


person Megatron    schedule 21.03.2011    source источник
comment
char_type наверняка должен быть членом std::basic_string<_Elem, _Traits, _ax>. Ошибки, которые вы получаете, по-видимому, связаны с неправильным объявлением типа in. К сожалению, у меня недостаточно опыта работы с Boost.Iostreams, чтобы сказать, как его следует объявлять, и мне придется оставить это другому комментатору. Я считаю, что интерфейс, предоставленный zlib, достаточно прост для работы сам по себе.   -  person Max Lybbert    schedule 21.03.2011


Ответы (1)


Попробуй это:

#include <string>
#include <iostream>
#include <sstream>
#include <boost\iostreams\filter\zlib.hpp>
#include <boost\iostreams\filtering_streambuf.hpp>
#include <boost\iostreams\copy.hpp>

std::string DecompressString(const std::string &compressedString)
{
    std::stringstream src(compressedString);
    boost::iostreams::filtering_streambuf<boost::iostreams::input> in(src);
    std::stringstream dst;
    boost::iostreams::filtering_streambuf<boost::iostreams::output> out(dst);
    in.push(boost::iostreams::zlib_decompressor());

    boost::iostreams::copy(in, out);
    return dst.str();
}

Основная проблема заключается в том, что вы пытаетесь использовать boost::iostreams::copy() для типов строк, а не типов потоков. Кроме того, включение zlib.hpp вместо gzip.hpp, вероятно, тоже не повредит.

person Ferruccio    schedule 21.03.2011
comment
Спасибо за предложение, но, к сожалению, это приводит к тому, что boost выдает исключение: Необработанное исключение по адресу 0x7627b727 в KHMP.exe: Исключение Microsoft C++: boost::exception_detail::clone_impl‹boost::exception_detail::error_info_injector‹std::logic_error › › в ячейке памяти 0x002cd770.. - person Megatron; 21.03.2011