2015-03-08 34 views
1

我试图在Boost :: iostreams文档中遵循有限状态过滤器的示例。但是当我去使用过滤器我得到一个错误,指出:: imbue不可访问,因为'boost :: iostreams :: detail :: finite_state_filter_impl'使用'protected'从'my_fsm'继承。使用Boost :: iostreams两用过滤器

沮丧我将我的代码复制到boost示例中使用的测试中。测试编译并通过。我的结论是我可能错误地使用了以下定义的双重使用过滤器:

typedef io :: finite_state_filter my_fsm_filter;

我觉得只是推到一个filtered_stream可能不正确,但我找不到一个缺失的步骤。我相信肯定有必要包装过滤器,但是我没有找到任何示例(尽管我确信如果我深入探究用于测试升级代码的代码,它必须在某处)。

这里是一个位的示例代码:

#include <boost/mpl/vector.hpp> 
#include <libs/iostreams/example/finite_state_filter.hpp> 

namespace io = boost::iostreams; 

struct my_fsm : io::finite_state_machine<my_fsm> { 
    BOOST_IOSTREAMS_FSM(my_fsm) // define skip and push. 
    typedef my_fsm self; 
    static const int beginline = 0; 
    static const int skipline = 1; 
    static const int dataline = 2; 

    typedef boost::mpl::vector < 
     row<beginline, is<'C'>, skipline, &self::skip>, 
     row<beginline, is_any, dataline, &self::push>, 
     row<skipline, is<'\n'>, beginline, &self::skip>, 
     row<skipline, is_any, skipline, &self::skip>, 
     row<dataline, is<'\n'>, beginline, &self::push>, 
     row<dataline, is_any, dataline, &self::push> 
    > transition_table; 
}; 

typedef io::finite_state_filter<my_fsm> my_fsm_filter; 

#include <iostream> 
#include <string> 
#include <boost/iostreams/device/file.hpp> 
#include <boost/iostreams/filtering_stream.hpp> 
#include <boost/iostreams/stream.hpp> 

namespace io = boost::iostreams; 

int main() { 
    io::stream<io::file_sink> out(io::file_sink("outputfile.txt")); 
    io::filtering_istream in; 
    my_fsm_filter infsm; 
    in.push(my_fsm_filter()); 
    in.push(io::file_source("inputdata.txt")); 

    while (in) { 
     std::string line; 
     if(std::getline(in, line)) { 
      //std::cout << line << std::endl; 
      out << line << std::endl; 
     } 
    } 
    return 0; 
} 

回答

1

我个人觉得有样品头相对于这种灌输调用的错误。

然而,你可以解决它通过更改的typedef

struct my_fsm_filter : io::finite_state_filter<my_fsm> { 
    using io::finite_state_filter<my_fsm>::imbue; 
}; 

这明确地公开imbue方法上派生类型的公共。我没有看过你报告过的示例程序(因为你没有链接到它)。但有可能他们使用类似的黑客攻击。

在我的测试中,类似的编辑finite_state_filte.hpp L278添加

using base_type::imbue; 

finite_state_filter类具有相同的效果。

相关问题