2013-03-02 66 views
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(); 
    } 
} 

我明显想要实现的是调用原始内存数组(应该调用构造函数)的新放置位置。然后我想调用数组中项目的析构函数和构造函数。问题是,项目是模板,所以如果我使用

Pool<FooBar> 

编译器期望找到“FooBar的()”和“〜FooBar的()”而不是“T()”和“〜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',调用,我有'new(item + i)T();' – WhozCraig 2013-03-02 10:04:28

+0

感谢,似乎GCC为(item + i)和(&item [i])生成了相同的程序集,谢谢你的指定,可能(item + i)更清晰。 – GameDeveloper 2013-03-02 10:14:41

+1

@DarioOO Eh。To each他们自己的,有些更喜欢你的方式,我总是一个指针算术的人, – WhozCraig 2013-03-02 10:16:53