Сначала я конвертирую строку utf-8 в utf-32, а затем хочу, чтобы уникальные слова отображались с их позициями. Я начал с повышения языкового стандарта.
#include <iostream>
#include <string>
#include <chrono>
#include <boost/shared_ptr.hpp>
#include <map>
#include <list>
#include <boost/locale.hpp>
typedef std::u32string string_type;
typedef std::pair<unsigned long, unsigned long> range_type;
typedef std::map<std::string, std::list<range_type>> wordref_type;
struct parser{
/**
* returns a map of "words" with its positions list
*/
static wordref_type parse(string_type::const_iterator b, string_type::const_iterator e){
wordref_type wordrefs;
range_type sentence;
boost::locale::boundary::segment_index<string_type::const_iterator> index(boost::locale::boundary::word, b, e);
//TODO: iterate index
return wordrefs;
}
};
int main(int argc, char** argv){
std::string input_str = "Some UTF-8 texts";
string_type buffer = boost::locale::conv::utf_to_utf<string_type::value_type>(input_str); // convert utf-8 to utf-32
wordref_type wordrefs = parser::parse(buffer.cbegin(), buffer.cend());
return 0;
}
Жалуется invalid use of incomplete type ‘const class boost::locale::boundary::boundary_indexing<char32_t>’
, Что случилось ? я имею Ideone‘редактировать
In file included from /usr/include/boost/locale/boundary.hpp:15:0,
from /usr/include/boost/locale.hpp:11,
from prog.cpp:7:
/usr/include/boost/locale/boundary/index.hpp: In instantiation of ‘static boost::locale::boundary::index_type boost::locale::boundary::details::mapping_traits<IteratorType, std::random_access_iterator_tag>::map(boost::locale::boundary::boundary_type, IteratorType, IteratorType, const std::locale&) [with IteratorType = __gnu_cxx::__normal_iterator<const char32_t*, std::__cxx11::basic_string<char32_t> >; boost::locale::boundary::index_type = std::vector<boost::locale::boundary::break_info>]’:
/usr/include/boost/locale/boundary/index.hpp:126:83: required from ‘boost::locale::boundary::details::mapping<BaseIterator>::mapping(boost::locale::boundary::boundary_type, boost::locale::boundary::details::mapping<BaseIterator>::base_iterator, boost::locale::boundary::details::mapping<BaseIterator>::base_iterator, const std::locale&) [with BaseIterator = __gnu_cxx::__normal_iterator<const char32_t*, std::__cxx11::basic_string<char32_t> >; boost::locale::boundary::details::mapping<BaseIterator>::base_iterator = __gnu_cxx::__normal_iterator<const char32_t*, std::__cxx11::basic_string<char32_t> >]’
/usr/include/boost/locale/boundary/index.hpp:631:43: required from ‘boost::locale::boundary::segment_index<BaseIterator>::segment_index(boost::locale::boundary::boundary_type, boost::locale::boundary::segment_index<BaseIterator>::base_iterator, boost::locale::boundary::segment_index<BaseIterator>::base_iterator, const std::locale&) [with BaseIterator = __gnu_cxx::__normal_iterator<const char32_t*, std::__cxx11::basic_string<char32_t> >; boost::locale::boundary::segment_index<BaseIterator>::base_iterator = __gnu_cxx::__normal_iterator<const char32_t*, std::__cxx11::basic_string<char32_t> >]’
prog.cpp:21:118: required from here
/usr/include/boost/locale/boundary/index.hpp:98:93: error: invalid use of incomplete type ‘const class boost::locale::boundary::boundary_indexing<char32_t>’
index_type tmp=std::use_facet<boundary_indexing<char_type> >(l).map(t,begin,end);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
In file included from /usr/include/boost/locale/boundary.hpp:12:0,
from /usr/include/boost/locale.hpp:11,
from prog.cpp:7:
/usr/include/boost/locale/boundary/facets.hpp:90:19: note: declaration of ‘class boost::locale::boundary::boundary_indexing<char32_t>’
class boundary_indexing;
^~~~~~~~~~~~~~~~~
In file included from /usr/include/boost/locale/boundary.hpp:15:0,
from /usr/include/boost/locale.hpp:11,
from prog.cpp:7:
/usr/include/boost/locale/boundary/index.hpp:103:95: error: invalid use of incomplete type ‘const class boost::locale::boundary::boundary_indexing<char32_t>’
index_type tmp = std::use_facet<boundary_indexing<char_type> >(l).map(t,str.c_str(),str.c_str()+str.size());
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
In file included from /usr/include/boost/locale/boundary.hpp:12:0,
from /usr/include/boost/locale.hpp:11,
from prog.cpp:7:
/usr/include/boost/locale/boundary/facets.hpp:90:19: note: declaration of ‘class boost::locale::boundary::boundary_indexing<char32_t>’
class boundary_indexing;
^~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/6/bits/locale_classes.h:850:0,
from /usr/include/c++/6/bits/ios_base.h:41,
from /usr/include/c++/6/ios:42,
from /usr/include/c++/6/ostream:38,
from /usr/include/c++/6/iostream:39,
from prog.cpp:1:
/usr/include/c++/6/bits/locale_classes.tcc: In instantiation of ‘const _Facet& std::use_facet(const std::locale&) [with _Facet = boost::locale::boundary::boundary_indexing<char32_t>]’:
/usr/include/boost/locale/boundary/index.hpp:98:89: required from ‘static boost::locale::boundary::index_type boost::locale::boundary::details::mapping_traits<IteratorType, std::random_access_iterator_tag>::map(boost::locale::boundary::boundary_type, IteratorType, IteratorType, const std::locale&) [with IteratorType = __gnu_cxx::__normal_iterator<const char32_t*, std::__cxx11::basic_string<char32_t> >; boost::locale::boundary::index_type = std::vector<boost::locale::boundary::break_info>]’
/usr/include/boost/locale/boundary/index.hpp:126:83: required from ‘boost::locale::boundary::details::mapping<BaseIterator>::mapping(boost::locale::boundary::boundary_type, boost::locale::boundary::details::mapping<BaseIterator>::base_iterator, boost::locale::boundary::details::mapping<BaseIterator>::base_iterator, const std::locale&) [with BaseIterator = __gnu_cxx::__normal_iterator<const char32_t*, std::__cxx11::basic_string<char32_t> >; boost::locale::boundary::details::mapping<BaseIterator>::base_iterator = __gnu_cxx::__normal_iterator<const char32_t*, std::__cxx11::basic_string<char32_t> >]’
/usr/include/boost/locale/boundary/index.hpp:631:43: required from ‘boost::locale::boundary::segment_index<BaseIterator>::segment_index(boost::locale::boundary::boundary_type, boost::locale::boundary::segment_index<BaseIterator>::base_iterator, boost::locale::boundary::segment_index<BaseIterator>::base_iterator, const std::locale&) [with BaseIterator = __gnu_cxx::__normal_iterator<const char32_t*, std::__cxx11::basic_string<char32_t> >; boost::locale::boundary::segment_index<BaseIterator>::base_iterator = __gnu_cxx::__normal_iterator<const char32_t*, std::__cxx11::basic_string<char32_t> >]’
prog.cpp:21:118: required from here
/usr/include/c++/6/bits/locale_classes.tcc:134:37: error: incomplete type ‘boost::locale::boundary::boundary_indexing<char32_t>’ used in nested name specifier
const size_t __i = _Facet::id._M_id();~~~~~~~~~~~^~~~~
Вам нужно скомпилировать форс с BOOST_LOCALE_ENABLE_CHAR32_T
включить boundary_indexing<char32_t>
но …
[акцент мой]Состояние поддержки C ++ 11 char16_t / char32_t
Поддержка C ++ 11
[….]char16_t
а такжеchar32_t
экспериментальный, в основном не работает и не предназначен для использования в производстве с текущими последними компиляторами: GCC-4.5, MSVC10, пока основные недостатки компилятора не будут исправлены.Если вы хотите собрать или протестировать Boost.Locale с поддержкой C ++ 11 char16_t и char32_t, вы должны передать
cxxflags="-DBOOST_LOCALE_ENABLE_CHAR32_T -DBOOST_LOCALE_ENABLE_CHAR16_T"
b2 во время сборки и определенияBOOST_LOCALE_ENABLE_CHAR32_T
а такжеBOOST_LOCALE_ENABLE_CHAR32_T
при использовании Boost.Locale
http://www.boost.org/doc/libs/1_66_0/libs/locale/doc/html/facets_8hpp_source.html
#ifdef BOOST_LOCALE_ENABLE_CHAR32_T
template<>
class BOOST_LOCALE_DECL boundary_indexing<char32_t> : public std::locale::facet {
Он жалуется на недопустимое использование неполного типа boost const class boost :: locale :: border :: border_indexing ’Что не так?
char32_t
не поддерживается. использование
#define BOOST_LOCALE_ENABLE_CHAR32_T
Но вам нужно включить это во время строительства библиотеки, а также:
Экспериментальная поддержка строк и потоков C ++ 0x char16_t и char32_t.
Далее глядя: http://www.boost.org/doc/libs/1_64_0/libs/locale/doc/html/status_of_cpp0x_characters_support.html
Если вы хотите построить или протестировать Boost.Locale с поддержкой char ++_t и char32_t в C ++ 11, вы должны передать cxxflags = «- DBOOST_LOCALE_ENABLE_CHAR32_T -DBOOST_LOCALE_ENABLE_CHAR16_T» b2 во время сборки и определить BOOST_LOCALE_ENABLE_CHOO_ABL_BAL_CHAR_BAL_CHAR_BAL_COO_BAR__CLE_COO_BAR__CLE_CLE_BAL_COO_BAR_RUS_BOO_BL_RUS_BAR__C_C_L_C_L_C_L_C_L_C_L_C_CLE_BOC_L_CLE_LOCLE_BOK_LOCALE_LOCALE_LOCALE_LOCALE_LOCALE_LOCALE_LOCALE_LOCALE_LOCALE_BOC_LOCLE_BOLE_BOLE_COOL