2013-03-13 43 views
0

我编写了一个代码,使用boost将输出写入gz文件。用增强功能编写gz流

class foo() { 
    std::ofstream traceOut; 
    struct traceRec { 
    traceRec(uint64_t c) : cycle(c) {}; 
    uint64_t cycle; 
    }; 
    void writeTrace(traceRec &rec) 
    { 
    try { 
     boost::iostreams::filtering_istream in; 
     in.push(boost::iostreams::gzip_decompressor()); 
     in.push(traceOut); // ERROR 
     std::cout << rec.cycle << std::endl; 
    } 
    catch(const boost::iostreams::gzip_error& e) { 
     std::cout << e.what() << '\n'; 
    } 
    } 
    void init() { 
    traceOut.open("log.gz", std::ios_base::in | std::ios_base::binary); 
    } 
    void bar() { 
    traceRec rec (1000); 
    writeTrace(rec); 
    } 
}; 

但是我得到这个错误在编译

/opt/boost_1_33_1/boost/iostreams/chain.hpp: In member function ‘void boost::iostreams::detail::chain_client<Chain>::push(std::basic_ostream<_CharT2,  _Traits2>&, int, int) [with CharType = char, TraitsType = std::char_traits<char>, Chain = boost::iostreams::chain<boost::iostreams::input, char, 
std::char_traits<char>, std::allocator<char> >]’: 
test.cpp: instantiated from here 
/opt/boost_1_33_1/boost/iostreams/chain.hpp:472: error: invalid application of ‘sizeof’ to incomplete type ‘boost::STATIC_ASSERTION_FAILURE<false>’ 
/opt/boost_1_33_1/boost/iostreams/traits.hpp: At global scope: 
/opt/boost_1_33_1/boost/iostreams/traits.hpp: In instantiation of ‘boost::iostreams::detail::member_category<mpl_::void_>’: 
/opt/boost_1_33_1/boost/mpl/eval_if.hpp:38: instantiated from ‘boost::mpl::eval_if<boost::iostreams::is_std_io<mpl_::void_>, boost::iostreams::select<boost::iostreams::is_iostream<mpl_::void_>, boost::iostreams::iostream_tag, boost::iostreams::is_istream<mpl_::void_>, boost::iostreams::istream_tag, boost::iostreams::is_ostream<mpl_::void_>, boost::iostreams::ostream_tag, boost::iostreams::is_streambuf<mpl_::void_>, boost::iostreams::streambuf_tag, mpl_::bool_<true>, mpl_::void_, mpl_::bool_<true>, mpl_::void_, mpl_::bool_<true>, mpl_::void_, mpl_::bool_<true>, mpl_::void_, mpl_::bool_<true>, mpl_::void_, mpl_::bool_<true>, mpl_::void_>, boost::iostreams::detail::member_category<mpl_::void_> >’ 
.... 

这是什么意思?

回答

2

请看看this,推()方法必须接收流,而不是任意对象

EDIT1(以下意见交换)

更改的traceOutstd::ifstream类型解决构建问题(至少使用boost 1.52)

+0

'std :: ofstream'是否符合流条件? – 2013-03-13 19:51:01

+0

你的意思是'in.push(std :: ofstream);'?它不工作 – mahmood 2013-03-13 19:53:44

+1

@mahmood不,我不是这样的:)根据boost静态检查,似乎增强期待他们自己的iostream对象和std ofstream不是一个“可接受的”模板,所以我使用boost iostream对象投票) – 2013-03-13 20:04:42