因此,我正在构建自己的类似于std :: vector的动态数组容器以进行娱乐/研究。我的容器的标头如下所示:
template<class ElementClass>
class Array
{
public:
Array(class Allocator* allocator, size_t initialCapacity);
~Array();
...
private:
class Allocator* allocator;
ElementClass* pFirst;
size_t m_capacity;
size_t m_size;
};
到目前为止,我的Array类与我提供给模板的任何类型都可以正常工作(woohoo!)。但是,当我尝试使用指针而不是对象类型时,当前的实现似乎很困难。析构函数就是一个很好的例子:
template<class ElementClass>
Array<ElementClass>::~Array()
{
for (size_t c = 0; c < m_capacity; c++)
{
pFirst[c]->~ElementClass();
}
allocator->free(pFirst);
}
[这显然会导致令人讨厌的错误,因为例如,如果我要创建一个Array<int*>
,则ElementClass
会转换为int*
,编译器正确地跳闸并继续掉下一段长长的台阶。另外,在其他地方也会发生这种情况,但为了简洁起见,我将其省略。
因此,我的问题是:处理此模板类的正确方法是什么,以便它允许我创建一个可以处理指针以及非指针类型的模板容器?我是否应该对出现此类问题的功能使用某种模板专门化技术?提前致谢。 :)
您似乎正在做的是在指针所指向的元素上调用dtor,而不是在数组中存储的指针值。如果您的阵列在dtor中除了执行其他操作,那是错误的...。
template<class ElementClass> Array<ElementClass>::~Array() { for (size_t c = 0; c < m_size; c++) { pFirst[c].~ElementClass(); } allocator->free(pFirst); }
对数组中的指针所指向的对象调用dtor对我来说非常危险。谁知道这些指针的来源(NULL,堆栈分配的变量等)。
。您正在尝试取消引用该指针,因此现在的类型为数组是“错误C2325:'int *':'->〜'右边的意外类型:预期的'int'”。
ElementClass的类型为
int*
int
。然后,您尝试在int*
上调用类型为[int
的dtor。