2009-06-15 4 views
1

다음 코드를 고려하십시오 삽입 :C++ : ptr_multimap에 문제가 ::

#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 컴파일러는 위의 코드를 컴파일러에 실패합니다. non-const를 삽입하여 잘못된 일을하고 있습니까? 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를 주조 j 실패했습니다.

답변

2

그게 문제 인 것 같습니다. 그것은 템플릿 매개 변수에 const없이 잘 컴파일됩니다.

+0

이는 라이브러리의 버그 일 수 있음을 의미합니까? –

1

내가 말할 수있는 것부터, 그것은 부스트 ​​라이브러리의 버그 인 것 같다.

하지만 int가 const가되는 이유를 이해하지 못합니다. 이 항목에 대한 메모리 관리를 ptr 컨테이너에 위임합니다. 비 const 항목을 제공하는 것은 공정한 것입니다. 이 컨테이너의 사용자가 포인터를 검색하여 수정하지 못하게하려면 클래스 계층을 삽입하여 const 요소 만 반환하는 것이 좋습니다.

+1

const에 대한 포인터를 삭제할 수 있으므로 const에 대한 포인터에서도 메모리 관리를 수행 할 수 있습니다. –

+0

오른쪽. 그러나 그 언어가 이상한 언어라는 것을 인정해야합니다. –