[英]What's the best way to handle pointer & non-pointer template types in a custom std::vector-like container?
因此,我正在构建我自己的类似于 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 类可以很好地与我提供给模板的任何类型一起工作(哇哦!)。 但是,当我尝试使用指针而不是对象类型时,我当前的实现似乎很难。 一个很好的例子是在析构函数中:
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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.