C ++: проблема с ptr_multimap :: insert - PullRequest
1 голос
/ 15 июня 2009

Пожалуйста, обратите внимание на следующий код:

#include "boost/ptr_container/ptr_map.hpp"

int main()
{
        typedef boost::ptr_multimap<char, const int> M;
        M m;
        char c = 'c';
        int* j = new int(7);
        m.insert(c, j);
        return 0;
}

Компилятору gcc 4.3.3 не удается скомпилировать вышеуказанный код. Я делаю что-то не так, вставляя неконстантные? Не могу ли я сохранить указатель на const в мультикарте?

try.cpp: In function ‘int main()’:
try.cpp:8: error: expected primary-expression before ‘=’ token
/usr/include/c++/4.3/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(const std::pair<_U1, _U2>&) [with _U1 = char, _U2 = const int*, _T1 = const char, _T2 = void*]’:
boost/boost_1_39_0/boost/ptr_container/ptr_map_adapter.hpp:765:   instantiated from ‘typename boost::ptr_container_detail::ptr_map_adapter_base<T, VoidPtrMap, CloneAllocator, Ordered>::iterator boost::ptr_multimap_adapter<T, VoidPtrMultiMap, CloneAllocator, Ordered>::insert_impl(const typename boost::ptr_container_detail::ptr_map_adapter_base<T, VoidPtrMap, CloneAllocator, Ordered>::key_type&, typename boost::ptr_container_detail::ptr_map_adapter_base<T, VoidPtrMap, CloneAllocator, Ordered>::mapped_type) [with T = const int, VoidPtrMultiMap = std::multimap<char, void*, std::less<char>, std::allocator<std::pair<const char, void*> > >, CloneAllocator = boost::heap_clone_allocator, bool Ordered = true]’
boost/boost_1_39_0/boost/ptr_container/ptr_map_adapter.hpp:799:   instantiated from ‘typename boost::ptr_container_detail::ptr_map_adapter_base<T, VoidPtrMap, CloneAllocator, Ordered>::iterator boost::ptr_multimap_adapter<T, VoidPtrMultiMap, CloneAllocator, Ordered>::insert(typename boost::ptr_container_detail::ptr_map_adapter_base<T, VoidPtrMap, CloneAllocator, Ordered>::key_type&, typename boost::ptr_container_detail::ptr_map_adapter_base<T, VoidPtrMap, CloneAllocator, Ordered>::mapped_type) [with T = const int, VoidPtrMultiMap = std::multimap<char, void*, std::less<char>, std::allocator<std::pair<const char, void*> > >, CloneAllocator = boost::heap_clone_allocator, bool Ordered = true]’
try.cpp:9:   instantiated from here
/usr/include/c++/4.3/bits/stl_pair.h:106: error: invalid conversion from ‘const void*’ to ‘void*’

Я также пытался, но потерпел неудачу с использованием const casting j перед вставкой

Ответы [ 2 ]

2 голосов
/ 15 июня 2009

Кажется, это проблема. Он прекрасно компилируется без констант в параметрах шаблона.

1 голос
/ 15 июня 2009

Из того, что я могу сказать, похоже, это ошибка в библиотеке буста.

Но я не понимаю, почему вы хотите, чтобы ваш int * был постоянным. Вы делегируете управление памятью для этого элемента контейнеру ptr. Справедливо предоставить его неконстантными предметами. Если вы не хотите, чтобы пользователи этого контейнера извлекали указатель и модифицировали его, я предлагаю вам вставить слой класса, чтобы возвращать только константные элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...