сохранение boost :: recursive_variant_ type в boost :: unordered_map завершается неудачно - PullRequest
0 голосов
/ 08 марта 2019

У меня возникла проблема при попытке сохранить объект boost::recursive_variant_type в boost::unordered_map.

Предположим, следующий код и все необходимые заголовочные файлы включены:

header.h

// [...]
namespace example_namespace 
{

using my_custom_class_t = boost::make_recursive_variant<
        bool,
        double,
        std::string,
        std::vector<boost::recursive_variant_>,
        boost::unordered_map<std::string, boost::recursive_variant_>
    >::type;

using my_custom_map = boost::unordered_map<std::string, my_custom_class_t>;

std::vector<my_custom_map> stack_;

}

source.cpp

// [...]
namespace example_namespace 
{

std::pair<std::string, my_custom_class_t> my_pair { "hi", my_custom_class_t(true) };

std::string s = my_pair.first;
my_custom_class_t t = my_pair.second;

// here comes the bad part
my_custom_map my_map;
my_map.emplace(s, t); // <- this is where compilation aborts

stack_.emplace_back(my_map);

}

Код компилируется просто отлично, если я не использую класс boost::unordered_map<std::string, my_custom_class_t> (все, что выше строки «здесь идет плохая часть»), но как только я хочу сохранить рекурсивный вариантный тип на карте (например, my_map) компилятор выдает следующие ошибки:

1>c:\...\include\xhash(31): error C2440: 'type cast': cannot convert from 'const _Kty' to 'size_t'
1>        with
1>        [
1>            _Kty=std::string
1>        ]
1>c:\...\include\xhash(31): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>d:\...\boost\container_hash\extensions.hpp(358): note: see reference to function template instantiation 'size_t stdext::hash_value<T>(const _Kty &)' being compiled
1>        with
1>        [
1>            T=std::string,
1>            _Kty=std::string
1>        ]
1>d:\...\boost\container_hash\extensions.hpp(357): note: while compiling class template member function 'size_t boost::hash<K>::operator ()(const T &) const'
1>        with
1>        [
1>            K=std::string,
1>            T=std::string
1>        ]
1>d:\...\boost\unordered\detail\implementation.hpp(2623): note: see reference to function template instantiation 'size_t boost::hash<K>::operator ()(const T &) const' being compiled
1>        with
1>        [
1>            K=std::string,
1>            T=std::string
1>        ]
1>d:\...\boost\type_traits\is_nothrow_move_assignable.hpp(29): note: see reference to class template instantiation 'boost::hash<K>' being compiled
1>        with
1>        [
1>            K=std::string
1>        ]
1>d:\...\boost\unordered\detail\implementation.hpp(2739): note: see reference to class template instantiation 'boost::is_nothrow_move_assignable<H>' being compiled
1>        with
1>        [
1>            H=boost::hash<std::string>
1>        ]
1>d:\...\boost\unordered\detail\implementation.hpp(2902): note: see reference to class template instantiation 'boost::unordered::detail::functions<boost::hash<K>,std::equal_to<K>>' being compiled
1>        with
1>        [
1>            K=std::string
1>        ]
1>d:\...\boost\unordered\unordered_map.hpp(60): note: see reference to class template instantiation 'boost::unordered::detail::table<boost::unordered::detail::map<A,K,T,H,P>>' being compiled
1>        with
1>        [
1>            A=std::allocator<std::pair<const std::string,example_namespace::my_custom_class_t>>,
1>            K=std::string,
1>            T=example_namespace::my_custom_class_t,
1>            H=boost::hash<std::string>,
1>            P=std::equal_to<std::string>
1>        ]
1>d:\...\my_model.cpp(47): note: see reference to class template instantiation 'boost::unordered::unordered_map<std::string,example_namespace::my_custom_class_t,boost::hash<K>,std::equal_to<K>,std::allocator<std::pair<const K,T>>>' being compiled
1>        with
1>        [
1>            K=std::string,
1>            T=example_namespace::my_custom_class_t
1>        ]

Возможно ли, что по какой-то причине рекурсивные варианты (например, с точки зрения выделения памяти) не могут быть сохранены в boost::unordered_map с?

...