2015-02-22 4 views
1

Пожалуйста, помогите мне получить базовый пример объектно-ориентированного boost :: algorithm :: boyer_moore_search интерфейса.boost :: algorithm :: boyer_moore_search Пример OO

Процедурный интерфейс работает для меня, например это компилируется и печатает «образец найден»:

#include <iostream> 
#include <string> 
#include <boost/algorithm/searching/boyer_moore.hpp> 

int main() { 
    std::string corpus("hello world"); 
    std::string pattern("hello"); 

    if (corpus.end() != boost::algorithm::boyer_moore_search(corpus.begin(), corpus.end(), 
                  pattern.begin(), pattern.end())) 
    { 
     std::cout << "pattern found" << std::endl; 
    } 
    return 0; 
} 

Но следующий с помощью интерфейса объектно-ориентированного дает ошибку компилятора, например,

#include <iostream> 
#include <string> 
#include <boost/algorithm/searching/boyer_moore.hpp> 

int main() { 
    std::string corpus("hello world"); 
    std::string pattern("hello"); 

    boost::algorithm::boyer_moore<std::string::const_iterator, std::string::const_iterator> 
     search(pattern.begin(), pattern.end()); 

    if (corpus.end() != search(corpus.begin(), corpus.end())) 
    { 
     std::cout << "pattern found" << std::endl; 
    } 
    return 0; 
} 

Это дает следующее сообщение об ошибке, которое легко воспроизводимым на ideone:

$ g++ test2.cpp 
In file included from test2.cpp:3:0: 
/usr/include/boost/algorithm/searching/boyer_moore.hpp: In instantiation of ‘class boost::algorithm::boyer_moore<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> > >’: 
test2.cpp:10:14: required from here 
/usr/include/boost/algorithm/searching/boyer_moore.hpp:104:39: error: no type named ‘skip_table_t’ in ‘class __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >’ 
     typename traits::skip_table_t skip_; 
            ^
/usr/include/boost/algorithm/searching/boyer_moore.hpp: In instantiation of ‘boost::algorithm::boyer_moore<patIter, traits>::boyer_moore(patIter, patIter) [with patIter = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >; traits = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >]’: 
test2.cpp:10:44: required from here 
/usr/include/boost/algorithm/searching/boyer_moore.hpp:63:50: error: using invalid field ‘boost::algorithm::boyer_moore<patIter, traits>::skip_’ 
        suffix_ (k_pattern_length + 1) 
               ^
/usr/include/boost/algorithm/searching/boyer_moore.hpp: In instantiation of ‘corpusIter boost::algorithm::boyer_moore<patIter, traits>::do_search(corpusIter, corpusIter) const [with corpusIter = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >; patIter = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >; traits = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >]’: 
/usr/include/boost/algorithm/searching/boyer_moore.hpp:92:66: required from ‘corpusIter boost::algorithm::boyer_moore<patIter, traits>::operator()(corpusIter, corpusIter) const [with corpusIter = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >; patIter = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >; traits = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >]’ 
test2.cpp:12:60: required from here 
/usr/include/boost/algorithm/searching/boyer_moore.hpp:133:27: error: using invalid field ‘boost::algorithm::boyer_moore<patIter, traits>::skip_’ 
       k = skip_ [ curPos [ j - 1 ]]; 
         ^

Я использую GCC 4.8.2 и повысить 1,54.

Я пытаюсь использовать интерфейс OO, потому что я собираюсь повторно искать один и тот же шаблон в разных корпусах и не хочу многократно вычислять одну и ту же таблицу пропуска.

ответ

3

Конструктор boyer_moore_search принимает один параметр типа шаблона, поскольку оба аргумента конструктора одного типа. Вы предоставили два.

Изменить декларацию search в:

boost::algorithm::boyer_moore<std::string::const_iterator> 
    search(pattern.begin(), pattern.end()); 

и он будет работать.

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