2014-01-09 3 views
3

C++ STL 컨테이너에서 사용자 정의 할당자를 사용하려고하는데 벡터와 함께 작동하지만 맵과 함께 실패합니다.std :: map에 대한 사용자 정의 할당자가 실패합니다.

#include <vector> 
#include <map> 
#include <stdio.h> 

static size_t alloc; 

     template <typename T> 
     class mmap_allocator: public std::allocator<T> 
     { 
public: 
       typedef size_t size_type; 
       typedef T* pointer; 
       typedef const T* const_pointer; 

       template<typename _Tp1> 
       struct rebind 
       { 
         typedef mmap_allocator<_Tp1> other; 
       }; 

       pointer allocate(size_type n, const void *hint=0) 
       { 
         fprintf(stderr, "Alloc %d bytes.\n", n); 
         alloc += n; 
         return std::allocator<T>::allocate(n, hint); 
       } 

       void deallocate(pointer p, size_type n) 
       { 
         fprintf(stderr, "Dealloc %d bytes (%p).\n", n, p); 
         alloc -= n; 
         return std::allocator<T>::deallocate(p, n); 
       } 

       mmap_allocator() throw(): std::allocator<T>() { fprintf(stderr, "Hello allocator!\n"); } 
       mmap_allocator(const mmap_allocator &a) throw(): std::allocator<T>(a) { } 
       ~mmap_allocator() throw() { } 
     }; 

int main(){ 

std::vector<int, mmap_allocator<int> > int_vec(1024, 0, mmap_allocator<int>()); 
std::map<int, int, std::less<int>, mmap_allocator<std::pair<int,int> > > x; 
x[1] = 2; 
printf("s=%lu\n", alloc); 
return 0; 
} 

리눅스, GCC 4.4.6 : 여기

In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/map:60, 
       from 4.cpp:2: 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_tree.h: In member function ‘_Alloc std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::get_allocator() const [with _Key = int, _Val = std::pair<const int, int>, _KeyOfValue = std::_Select1st<std::pair<const int, int> >, _Compare = std::less<int>, _Alloc = mmap_allocator<std::pair<const int, int> >]’: 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_tree.h:383: instantiated from ‘void std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_destroy_node(std::_Rb_tree_node<_Val>*) [with _Key = int, _Val = std::pair<const int, int>, _KeyOfValue = std::_Select1st<std::pair<const int, int> >, _Compare = std::less<int>, _Alloc = mmap_allocator<std::pair<const int, int> >]’ 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_tree.h:972: instantiated from ‘void std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_erase(std::_Rb_tree_node<_Val>*) [with _Key = int, _Val = std::pair<const int, int>, _KeyOfValue = std::_Select1st<std::pair<const int, int> >, _Compare = std::less<int>, _Alloc = mmap_allocator<std::pair<const int, int> >]’ 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_tree.h:614: instantiated from ‘std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::~_Rb_tree() [with _Key = int, _Val = std::pair<const int, int>, _KeyOfValue = std::_Select1st<std::pair<const int, int> >, _Compare = std::less<int>, _Alloc = mmap_allocator<std::pair<const int, int> >]’ 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_map.h:87: instantiated from here 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_tree.h:354: error: no matching function for call to ‘mmap_allocator<std::pair<const int, int> >::mmap_allocator(const mmap_allocator<std::_Rb_tree_node<std::pair<const int, int> > >&)’ 
4.cpp:37: note: candidates are: mmap_allocator<T>::mmap_allocator(const mmap_allocator<T>&) [with T = std::pair<const int, int>] 
4.cpp:36: note:     mmap_allocator<T>::mmap_allocator() [with T = std::pair<const int, int>] 

를 기다리고 있었다으로 mmap_allocator<std::pair<const int, int> >를 사용 mmap_allocator<std::_Rb_tree_node<std::pair<const int, int> > >하지에 대한 몇 가지 이상한 오류 코드입니다.

+0

같은 문제를 만났습니다. 문제점을 발견 했습니까? – limi

답변

0

나는 그것을 고치려고하지는 않았지만 다른 템플릿 인수로 할당 자 인스턴스를 취하는 생성자를 정의하지 않은 것 같습니다. 즉, 당신이 그것의 모습에서

template <typename T> 
    template <typename O> 
mmap_allocator<T>::mmap_allocator(mmap_allocator<O> const& other) { 
    ... 
} 

같은 누락, 오류가 다른 할당으로 rebind에서 얻은 할당 유형을 만들려고 노력에서 유래한다.

관련 문제