1847633 Members
3392 Online
110265 Solutions
New Discussion

Help with STLS

 
Rohit MAttoo
New Member

Help with STLS

This is how I have created my own allocator.

#ifndef POOL_ALLOCATOR_H_INCLUDED_GF
#define POOL_ALLOCATOR_H_INCLUDED_GF

#include
#include "pool.h"

//template class pool_allocator;

template
class pool_allocator
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef T value_type;

template
struct rebind { typedef pool_allocator other; };

pointer address(reference x) const {return &x;}
const_pointer address(const_reference x) const {return &x;}

pool_allocator(){}
pool_allocator(const pool_allocator&) {}
template
pool_allocator (const pool_allocator&) {}
~pool_allocator(){}


size_type max_size() const throw() {return size_t(-1) / sizeof(value_type);}

pointer allocate(size_type size, const void* hint = 0)
{
return static_cast(mem_.allocate(size*sizeof(T)));
}

void construct(pointer p, const T& val)
{
new(static_cast(p)) T(val);
}
void construct(pointer p)
{
new(static_cast(p)) T();
}

void destroy(pointer p){p->~T();}
void destroy(char* ){}
void destroy(void* ){}


void deallocate(pointer p, size_type n)
{
mem_.deallocate(p, n);
}
void deallocate(void *p, size_type n)
{
mem_.deallocate(p, n);
}
void deallocate(pointer p)
{
mem_.deallocate(p);
}
void deallocate(void *p)
{
mem_.deallocate(p);
}

static void dump(){
mem_.dump();
}

private:

static pool mem_;
};

template pool pool_allocator::mem_;

template <>
class pool_allocator
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef void* pointer;
typedef const void* const_pointer;
template
struct rebind { typedef pool_allocator other; };
pool_allocator() {}
~pool_allocator() {}
};


template
inline bool operator==(const pool_allocator&, const pool_allocator){return true;}

template
inline bool operator!=(const pool_allocator&, const pool_allocator){return false;}

template >
struct PooledMap
{
typedef map > > Type;
};

#endif

However, when I try doing something as simple as map,
pool_allocator > > m; and try to build it with aCC (aCC: HP ANSI C++ B3910B A.03.39) I get following errors.

Error 874: "/opt/aCC/include/memory", line 529 # A non-void type is
required for specialization instead of 'void' since the template
creates a reference to that type.
typedef T& reference;
^^^^^^^^^
Error 874: "/opt/aCC/include/memory", line 530 # A non-void type is
required for specialization instead of 'void' since the template
creates a reference to that type.
typedef const T& const_reference;
^^^^^^^^^^^^^^^
Error 874: "/opt/aCC/include/memory", line 546 # A non-void type is
required for specialization instead of 'void' since the template
creates a reference to that type.
pointer address (T& x)
^^^^^^^
Error 874: "/opt/aCC/include/memory", line 546 # A non-void type is
required for specialization instead of 'void' since the template
creates a reference to that type.
pointer address (T& x)
^^^^^^^
Error 874: "/opt/aCC/include/memory", line 595 # A non-void type is
required for specialization instead of 'void' since the template
creates a reference to that type.
allocator_interface::construct(pointer p, const T&
val)
^^^^^^^^^
Error 874: "/opt/aCC/include/memory", line 595 # A non-void type is
required for specialization instead of 'void' since the template
creates a reference to that type.
allocator_interface::construct(pointer p, const T&
val)


I am not very good at this ... any reasons why this could be happening
?

~Rohit