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

私が明らかに達成したいのは、生のメモリ配列で新しい配置を呼び出すことです(コンストラクターをokと呼ぶ必要があります)。次に、配列内のアイテムのデストラクタとコンストラクタを呼び出します。問題は、アイテムがテンプレートであるため、使用する場合

Pool<FooBar>

コンパイラは、「T()」と「〜T()」の代わりに「FooBar()」と「〜FooBar()」を見つけることを期待しています。それを行うための特定の構文はありますか?

C++11ではなくC ++03を使用しています

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 に答える