简体   繁体   English

提升语言环境不完整的类型boundary_indexing <char32_t>

[英]boost locale incomplete type boundary_indexing<char32_t>

I am first converting an utf-8 string to utf-32 and then I want unique words to be mapped with their positions. 我首先将utf-8字符串转换为utf-32,然后我希望将唯一的单词与其位置进行映射。 I started with boost locale. 我从提升语言环境开始。

#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;
}

It complains invalid use of incomplete type 'const class boost::locale::boundary::boundary_indexing<char32_t>' . 它抱怨invalid use of incomplete type 'const class boost::locale::boundary::boundary_indexing<char32_t>' What is wrong ? 怎么了 ? I have Ideone 'ed it 我有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();


                ~~~~~~~~~~~^~~~~

You need to compile boost with BOOST_LOCALE_ENABLE_CHAR32_T to include the boundary_indexing<char32_t> but ... 您需要使用BOOST_LOCALE_ENABLE_CHAR32_T编译boost以包括boundary_indexing<char32_t>但是...

Status of C++11 char16_t/char32_t support C ++ 11 char16_t / char32_t支持的状态

The support of C++11 char16_t and char32_t is experimental, mostly does not work and not intended to be used in production with current latest compilers: GCC-4.5, MSVC10 till major compiler's flaws would be fixed. C ++ 11 char16_tchar32_t的支持是试验性的, 大多数情况下不起作用,并且不打算用于当前最新编译器(GCC-4.5,MSVC10)的生产中 ,直到主要编译器的缺陷得以修复。

[....] [....]

If you want to build or test Boost.Locale with C++11 char16_t and char32_t support you should pass cxxflags="-DBOOST_LOCALE_ENABLE_CHAR32_T -DBOOST_LOCALE_ENABLE_CHAR16_T" to b2 during build and define BOOST_LOCALE_ENABLE_CHAR32_T and BOOST_LOCALE_ENABLE_CHAR32_T when using Boost.Locale 如果要使用C ++ 11 char16_t和char32_t支持构建或测试Boost.Locale,则应在构建过程cxxflags="-DBOOST_LOCALE_ENABLE_CHAR32_T -DBOOST_LOCALE_ENABLE_CHAR16_T"传递给b2,并在使用BOOST_LOCALE_e和BOOST_LOCALE_ENABLE_CHAR32_T时定义BOOST_LOCALE_ENABLE_CHAR32_T和BOOST_LOCALE_e。

[emphasis mine] [强调我的]

http://www.boost.org/doc/libs/1_66_0/libs/locale/doc/html/facets_8hpp_source.html 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 {

It complains invalid use of incomplete type 'const class boost::locale::boundary::boundary_indexing' What's wrong? 它抱怨不完整类型'const class boost :: locale :: boundary :: boundary_indexing'的无效使用怎么了?

char32_t is not supported. 不支持char32_t Use 采用

#define BOOST_LOCALE_ENABLE_CHAR32_T

But you need to enable it during building the library, as well: 但是,您还需要在构建库时启用它

Experimental support for C++0x char16_t and char32_t strings and streams. 对C ++ 0x char16_t和char32_t字符串和流的实验支持。

Further looking: http://www.boost.org/doc/libs/1_64_0/libs/locale/doc/html/status_of_cpp0x_characters_support.html 进一步查看: http : //www.boost.org/doc/libs/1_64_0/libs/locale/doc/html/status_of_cpp0x_characters_support.html

If you want to build or test Boost.Locale with C++11 char16_t and char32_t support you should pass cxxflags="-DBOOST_LOCALE_ENABLE_CHAR32_T -DBOOST_LOCALE_ENABLE_CHAR16_T" to b2 during build and define BOOST_LOCALE_ENABLE_CHAR32_T and BOOST_LOCALE_ENABLE_CHAR32_T when using Boost.Locale 如果要使用C ++ 11 char16_t和char32_t支持构建或测试Boost.Locale,则应在构建过程中将cxxflags =“-DBOOST_LOCALE_ENABLE_CHAR32_T -DBOOST_LOCALE_ENABLE_CHAR16_T”传递给b2,并在使用BOOST_LOCALE_e和BOOST_LOCALE_e时定义BOOST_LOCALE_ENABLE_CHAR32_T和BOOST_LOCALE_e。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM