You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:55:29