2009-06-15 9 views
1

Bitte beachten Sie den folgenden Code ein:C++: Problem mit ptr_multimap :: einfügen

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

Der gcc 4.3.3 Compiler nicht den obigen Code Compiler. Mache ich etwas falsch, indem ich eine nicht-konstante einfüge? Kann ich keinen Zeiger auf const in der Multimap speichern?

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*’ 

Ich habe auch versucht, aber mit konst Guss j vor dem Einsetzen fehlgeschlagen.

Antwort

2

Das scheint das Problem zu sein. Es kompiliert ohne die Konstante in den Vorlagenparametern.

+0

bedeutet das, dass dies ein Fehler in der Bibliothek sein könnte? –

1

Von was ich sagen kann, scheint es ein Fehler in der Boost-Bibliothek zu sein.

Aber ich verstehe nicht, warum Sie möchten, dass Ihr int * const ist. Sie delegieren die Verwaltung des Speichers für dieses Element an den PTR-Container. Es ist nur fair, es mit nicht-konformen Gegenständen zu versehen. Wenn Sie nicht möchten, dass Benutzer dieses Containers den Zeiger abrufen und ändern, schlagen Sie vor, dass Sie einen Klassen-Layer einfügen, um nur konstante Elemente zurückzugeben.

+1

Speicherverwaltung kann auf Zeiger zu einem const auch getan werden, da ein Zeiger zu einem const gelöscht werden kann. –

+0

Rechts. Aber Sie müssen zugeben, es ist ein komisches Sprachmittel. –