2015-03-08 1 views
1

Я пытался следовать примеру финитных фильтров в документации Boost :: iostreams. Однако, когда я перешел на , используйте фильтр. Я получил ошибку, указав, что :: imbue не был доступен, потому что «boost :: iostreams :: detail :: final_state_filter_impl» использует «protected» для наследования от «my_fsm».Использование Boost :: фильтры с двойным использованием iostreams

Разочарованный Я скопировал свой код в те тесты, которые использовались в примерах форсирования. Тесты собираются и проходят. Мое предположение состоит в том, что я, вероятно, неправильно использую фильтр с двойным использованием, определяемый:

typedef io :: final_state_filter my_fsm_filter;

Я чувствую, что просто нажимать его на filter_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

Я лично считаю, что есть ошибка в заголовке образца относительно этого пропитать вызова.

Однако, вы можете обойти это путем изменения ЬурейеЕ к

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 имеет тот же эффект.

Смежные вопросы