2013-03-02 3 views
4

почему это не компилируется?templated размещение нового и деструктора

template <typename T> 
class Pool{ 

    char Buff[sizeof(T)*256]; 

public: 

    Pool(){ 
     T* item = reinterpret_cast<T*>(&Buff[0]); 
     for(int i =0 ; i<256;i++) 
      item[i] = new(&item[i]) T(); 
    } 

    ~Pool(){ 
     T* item = reinterpret_cast<T*>(&Buff[0]); 
     for(int i =0 ; i<256;i++) 
      item[i] -> ~ T(); 
    } 

    void reset(unsigned int i){ 
     T* item = reinterpret_cast<T*>(&Buff[0]); 
     item[i]->~T(); 
     item[i]->T(); 
    } 
} 

Что я, очевидно, хочу, чтобы достичь зовю размещение нового на необработанный массиве памяти (который должен вызвать конструктор КИ). Затем я хочу вызвать деструктор и конструктор элементов в массиве. Проблема заключается в том, что пункт является шаблон и поэтому, если я использую

Pool<FooBar> 

компилятор ожидал найти «FooBar()» и «~ FooBar()» вместо «Т()» и «~ T()» , Есть ли какой-нибудь конкретный синтаксис для этого?

Я использую C++ 03 не C++ 11

ответ

6

Ваш синтаксис не совсем верно. Ниже следует сделать трюк:

Pool() { 
    T* item = reinterpret_cast<T*>(&Buff[0]); 
    for(int i = 0; i < 256; i++) 
     new(&item[i]) T(); 
} 

~Pool() { 
    T* item = reinterpret_cast<T*>(&Buff[0]); 
    for (int i = 0; i < 256; i++) 
     item[i].~T(); 
} 

void reset(unsigned int i) { 
    T* item = reinterpret_cast<T*>(&Buff[0]); 
    item[i].~T(); 
    new(&item[i]) T(); 
} 
+1

+1 Буквально дословно то, что я собирался опубликовать (за исключением последнего 'new', вызов, где я был' новый (пункт + я) T(); ' – WhozCraig

+0

спасибо, кажется, что GCC генерирует одну и ту же сборку для обоих (item + i) и (& item [i]), спасибо за назначение этого, возможно (item + i) более понятно читать. – GameDeveloper

+1

@DarioOO Eh. они предпочитают то, что у вас есть. Я всегда был арифметическим любопытным парнем. – WhozCraig

Смежные вопросы