7.e.Q
12-01-2006, 06:47
Guten Morgen,
ich möchte einen eigenen Allocator für die std::map<> implementieren, um dafür Sorge zu tragen, daß der für gelöschte Elemente der Map alloziierte Speicherbereich auch wirklich wieder freigegeben wird.
Ich habe angefangen, ein wenig mit custom allocators rumzuspielen, jedoch bekomme ich die ganzen Beispiele, die es im INet gibt nicht übersetzt. Ich bekomme beispielsweise immer die Fehlermeldung:
g++ -DISTSBIOS -DNCURSES -Wall -g -Icg -c -o obj/CGProcess.o CGProcess.cxx
In file included from CSysUnit.h:13,
from Client.h:20,
from main.h:42,
from main.cxx:22:
allocator.h:29: error: no type `const_pointer' in `std::bios_allocator<void>'
allocator.h:29: error: parse error before `=' token
allocator.h:29: error: template definition of non-template `T*
std::bios_allocator<void>::allocate(...)'
allocator.h:29: error: invalid member template declaration `T*
std::bios_allocator<void>::allocate(...)'
... und noch weitere. Dies ist allerdings die erste.
Die allocator.h sieht so aus. Stumpf abgetippt (Name von allocator auf bios_allocator geändert, weil der Compiler wegen Redefinition rumheulte), da ich noch nicht ganz verinnerlicht habe, was ich da tu; darum frage ich auch:
#ifndef __ALLOCATOR_H__
#define __ALLOCATOR_H__
#include <memory>
namespace std {
template<class T>
class bios_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<class U> struct rebind { typedef bios_allocator<U> other; };
bios_allocator() throw();
bios_allocator(const bios_allocator&) throw();
template<class U> bios_allocator(const bios_allocator<U>&) throw();
~bios_allocator() throw();
pointer address(reference x) const;
const_pointer address(const_reference x) const;
pointer allocate(size_type, bios_allocator<void>::const_pointer hint = 0);
void deallocate(pointer p, size_type n);
void construct(pointer p, const T& val);
void destroy(pointer p);
template<class T1, class T2> bool operator==(const bios_allocator<T1>&, const bios_allocator<T2>&) throw();
template<class T1, class T2> bool operator!=(const bios_allocator<T1>&, const bios_allocator<T2>&) throw();
};
#endif
Kann mir jemand sagen, was da falsch ist?
ich möchte einen eigenen Allocator für die std::map<> implementieren, um dafür Sorge zu tragen, daß der für gelöschte Elemente der Map alloziierte Speicherbereich auch wirklich wieder freigegeben wird.
Ich habe angefangen, ein wenig mit custom allocators rumzuspielen, jedoch bekomme ich die ganzen Beispiele, die es im INet gibt nicht übersetzt. Ich bekomme beispielsweise immer die Fehlermeldung:
g++ -DISTSBIOS -DNCURSES -Wall -g -Icg -c -o obj/CGProcess.o CGProcess.cxx
In file included from CSysUnit.h:13,
from Client.h:20,
from main.h:42,
from main.cxx:22:
allocator.h:29: error: no type `const_pointer' in `std::bios_allocator<void>'
allocator.h:29: error: parse error before `=' token
allocator.h:29: error: template definition of non-template `T*
std::bios_allocator<void>::allocate(...)'
allocator.h:29: error: invalid member template declaration `T*
std::bios_allocator<void>::allocate(...)'
... und noch weitere. Dies ist allerdings die erste.
Die allocator.h sieht so aus. Stumpf abgetippt (Name von allocator auf bios_allocator geändert, weil der Compiler wegen Redefinition rumheulte), da ich noch nicht ganz verinnerlicht habe, was ich da tu; darum frage ich auch:
#ifndef __ALLOCATOR_H__
#define __ALLOCATOR_H__
#include <memory>
namespace std {
template<class T>
class bios_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<class U> struct rebind { typedef bios_allocator<U> other; };
bios_allocator() throw();
bios_allocator(const bios_allocator&) throw();
template<class U> bios_allocator(const bios_allocator<U>&) throw();
~bios_allocator() throw();
pointer address(reference x) const;
const_pointer address(const_reference x) const;
pointer allocate(size_type, bios_allocator<void>::const_pointer hint = 0);
void deallocate(pointer p, size_type n);
void construct(pointer p, const T& val);
void destroy(pointer p);
template<class T1, class T2> bool operator==(const bios_allocator<T1>&, const bios_allocator<T2>&) throw();
template<class T1, class T2> bool operator!=(const bios_allocator<T1>&, const bios_allocator<T2>&) throw();
};
#endif
Kann mir jemand sagen, was da falsch ist?