шаблонное размещение new и деструктор

почему это не компилируется?

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();
    }
}

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

Pool<FooBar>

компилятор ожидает найти "FooBar()" и "~FooBar()" вместо "T()" и "~T()". есть ли какой-то особый синтаксис для этого?

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


person CoffeDeveloper    schedule 02.03.2013    source источник


Ответы (1)


Ваш синтаксис не совсем правильный. Следующее должно помочь:

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();
}
person NPE    schedule 02.03.2013
comment
+1 Буквально дословно к тому, что я собирался написать (за исключением последнего new, звоните, где у меня было new(item+i) T();. - person WhozCraig; 02.03.2013
comment
спасибо, кажется, что GCC генерирует одну и ту же сборку как для (item+i), так и для (&item[i]), спасибо за назначение, возможно, (item+i) более понятно для чтения. - person CoffeDeveloper; 02.03.2013
comment
@DarioOO Эх. Каждому свое. Некоторые предпочитают, как у вас есть. Я всегда был сторонником арифметики указателей. - person WhozCraig; 02.03.2013
comment
@DarioOO: Семантически они абсолютно эквивалентны. Выбор чисто стилистический. - person NPE; 02.03.2013