C++自定义动态数组报错求助,疑与typename相关
自定义动态数组类的
<error-type>错误排查与修复 问题背景
因所用库与std库(如vector、iostream等)不兼容,自行编写可扩容动态数组类Array替代vector,但运行时出现<error-type>错误,怀疑和typename有关,但对typename了解有限。
自定义Array类代码
template <typename T> class Array { // 可扩容动态数组,替代vector以获得最大兼容性 private: T* array; size_t used; size_t size; public: // size为数组初始容量 Array(size_t size) { this->array = new T[size]; this->used = 0; this->size = size; } void append(T element) { if (this->size == this->used) { this->size *= 2; T* newArray = new T[this->size]; for (size_t i = 0; i < this->used; i++) { newArray[i] = this->array[i]; } delete[] this->array; this->array = newArray; } this->array[this->used++] = element; } T operator[](size_t index) { return this->array[index]; } };
测试代码
#include "Headers/array.hpp" int main() { Array<int> arr = Array(10); }
错误原因与修复
1. 测试代码的类型匹配问题
测试代码中Array(10)是未指定模板参数的临时对象,C++无法自动推导其模板类型为int,导致Array<int>与未特化的Array临时对象类型不匹配,无法直接赋值。
修复方式(二选一即可):
// 方式1:直接构造指定模板类型的对象 Array<int> arr(10); // 方式2:显式指定临时对象的模板参数 Array<int> arr = Array<int>(10);
2. 类设计的潜在缺陷(非当前错误,但需修复避免后续问题)
- 缺少析构函数:当前类未释放
new分配的数组内存,会导致内存泄漏,需添加:~Array() { delete[] this->array; } operator[]返回值限制:当前返回T值,无法通过arr[index] = value修改数组元素,应改为返回引用,并补充const版本:T& operator[](size_t index) { return this->array[index]; } const T& operator[](size_t index) const { return this->array[index]; }- 缺少拷贝构造与拷贝赋值运算符:编译器自动生成的版本会进行浅拷贝,导致多个
Array对象共享同一块内存,析构时重复释放引发崩溃。示例实现拷贝构造函数:Array(const Array& other) { this->size = other.size; this->used = other.used; this->array = new T[this->size]; for (size_t i = 0; i < this->used; i++) { this->array[i] = other.array[i]; } }
关于typename的疑问
当前代码中typename的使用是正确的(用于声明模板参数T),本次错误与typename无关,问题出在测试代码的类型匹配以及类的不完整实现上。
内容的提问来源于stack exchange,提问作者gaby
相关产品推荐
相关产品推荐

