在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
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'"。
元素类的类型为int*
。您正在尝试取消引用该指针,因此现在类型为int
。然后,您正在尝试在int
上调用类型int*
的 dtor。
相关文章:
- C++中的双指针类型转换
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 将类指针类型转换为键时出错
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- C++在一个映射中存储不同的指针类型(并处理销毁)
- 指针类型类成员的动态强制转换的恒定性是什么?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- STL 函数和函数类型与函数指针类型
- 如何调用指针类型的方法(禁用多态性)?
- 为什么新表达式可以正确生成指针类型,即使它应该返回 void*?
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 是否允许调用方对我的 Builder 类使用任何指针类型(包括智能指针)?
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 专门用于"direct"函数类型(与函数指针类型相对)
- 指向成员的指针类型和模板
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 在C++17中,为什么类模板和函数模板的指针类型推导明显不一致
- 为什么允许将整型、枚举和指向成员的指针类型reinterpret_cast到自身?