4

为什么不编译?

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

我显然想要实现的是在原始内存数组上调用placement new(应该调用构造函数ok)。然后我想调用数组中项目的析构函数和构造函数。问题是 Item 是模板,所以如果我使用

Pool<FooBar>

编译器期望找到“FooBar()”和“~FooBar()”而不是“T()”和“~T()”。有什么特殊的语法可以做到这一点吗?

我使用的是C++03而不是 C++11

4

1 回答 1

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();
}
于 2013-03-02T10:00:22.253 回答