繁体   English   中英

在自定义 std::vector 类容器中处理指针和非指针模板类型的最佳方法是什么?

[英]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:‘i​​nt *’:‘->~’右侧的意外类型:预期为‘int’”。

ElementClass 是int*类型。 您正在尝试取消引用该指针,因此现在类型为int 然后,您尝试呼叫类型的析构函数int*上的int

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM