Cześć!
Staram się poskładać do kupy moje poprzednie wypociny i zastanawiam się jak sensownie nazwać i jak trzymać dostęp do nowych alokatorów czy operatorów new/delete.
Postanowiłem zrobić przestrzeń dla przykładu mymem
.
Chcę w tej przestrzeni trzymać np. mymem::allocator
(podobnie jak w std), jakieś funkcje pomocnicze.
Problem pojawił się dla new/delete. Pomyślałem by zastosować przy pisaniu taką składnie:
/* ... */
int main(){
//int * i = new int(2);
int * i = mymem::_new<int>(2);
std::cout << std::dec << *i << std::endl;
/* ... */
return 0;
}
Przykładowy _new
alokujący pamięć w zmiennej statycznej (coś ala sbrk).
namespace mymem
{
// example of memory
static char memory[1024*64];
static char * memory_end = memory;
template<typename _Tp>
_Tp * alloc(size_t n){
char * ptr = memory_end;
memory_end += n;
if( (memory_end - memory) > sizeof(memory))
std::__throw_bad_alloc();
return reinterpret_cast<_Tp*>(ptr);
}
template<typename _Tp, typename... _Args>
_Tp * _new(_Args&&... __args){
_Tp * p = alloc<_Tp>(sizeof(_Tp));
::new((void *)p) _Tp(std::forward<_Args>(__args)...);
return p;
}
};
Właśnie, jak zauważyliście, musiałem nazwać _new
bo inaczej:
expected unqualified-id before 'new'
_Tp * new(_Args&&... __args){
^~~
Żeby tak zrobić to new
musi być zadeklarowane jako operator, niestety w namespace
wywala błąd.
void* mymem::operator new(std::size_t)' may not be declared within a namespace
void * operator new(std::size_t count){
^
Oczywiście w klasie nie ma problemu:
class Foo
{
void * operator new(std::size_t count){
}
};
Jak więc to jest że operator ::new
nie jest w klasie a działa?