2011-06-09 24 views
7

Tengo un asignador extremadamente básico:std :: mapa asignador de trabajar

template<typename T> 
struct Allocator : public std::allocator<T> { 
    inline typename std::allocator<T>::pointer allocate(typename std::allocator<T>::size_type n, typename std::allocator<void>::const_pointer = 0) { 
    std::cout << "Allocating: " << n << " itens." << std::endl; 
    return reinterpret_cast<typename std::allocator<T>::pointer>(::operator new(n * sizeof (T))); 
    } 

    inline void deallocate(typename std::allocator<T>::pointer p, typename std::allocator<T>::size_type n) { 
    std::cout << "Dealloc: " << n << " itens." << std::endl; 
     ::operator delete(p); 
    } 

    template<typename U> 
    struct rebind { 
     typedef Allocator<U> other; 
    }; 
}; 

que funciona muy bien cuando lo uso con: "std :: vector>", sin embargo, cuando intento uso con un std :: mapa como:

int main(int, char**) { 
    std::map<int, int, Allocator< std::pair<const int, int> > > map; 

    for (int i(0); i < 100; ++i) { 
     std::cout << "Inserting the " << i << " item. " << std::endl; 
     map.insert(std::make_pair(i*i, 2*i)); 
    } 

    return 0; 
} 

se falla al compilar (gcc 4.6) dando un tiempo extremadamente largo que termina con error: /usr/lib/gcc/x86_64-redhat-linux/4.6.0/../../../../include/c++/4.6.0/bits/stl_tree.h:959:25: error: no match for call to ‘(Allocator<std::pair<const int, int> >) (std::pair<const int, int>::first_type&, const int&)’

+0

¿Por qué crees que necesitas un asignador personalizado? –

Respuesta

16

Debido asignador es cuarto parámetro de plantilla, mientras que tercero parámetro es como comparador std::less? para que std::map<int, int, std::less<int>, Allocator< std::pair<const int, int> > > funcione.

También creo que se debe añadir ctor defecto y copia ctor:

Allocator() {} 

    template<class Other> 
    Allocator(const Allocator<Other>& _Right) {} 
+3

+1 para hacer las cosas bien. solo un detalle: no es necesario el constructor predeterminado –

+3

Es un constructor de conversión genérico, no un constructor de copia. Pero el constructor predeterminado es necesario ... – Potatoswatter

0

En caso de que si alguien está buscando la forma generalizada:

template<class Key, class T,class Compare = std::less<Key>, class _Ax = Allocator<std::pair<const Key, T> >> 
class Map : public std::map<Key, T, Compare, _Ax > 
{ 
}; 

luego usarlo,

Map<int,char> myMap; 
myMap.insert<std::pair<int,char>(1,'o'); 
Cuestiones relacionadas