如何实现可存任意类型的C++自定义vector类?实例化错误求解
问题排查:模板vector实例化时数值被截断的原因及解决方法
核心原因
你实例化的是myVector<int>,这意味着容器的存储类型被固定为int。构造函数的第二个参数values的类型是模板参数T(也就是int),所以当你传入2.2这个double类型值时,会先触发隐式类型转换,将浮点数2.2截断为整数2,再存入容器的int数组中。容器里从一开始存储的就是整数2,自然输出结果都是2。
代码问题拆解
看构造函数的定义:
template <class T> myVector<T>::myVector(int nOfElement, T values)
第二个参数的类型与容器存储类型T强绑定,当T为int时,任何传入的非int值都会被强制转换为int,这就是数值被截断的根源。
解决方法
根据你的需求,有两种可行的处理方式:
方式1:使用匹配的模板类型实例化
如果你的目标是存储浮点数,直接将容器实例化为double类型即可:
myVector<double> v3(3, 2.2);
此时构造函数的第二个参数类型为double,传入2.2不会发生截断,容器存储的是完整的浮点数,输出结果就是预期的2.2 2.2 2.2。
方式2:让构造函数支持任意类型初始值(更灵活)
如果希望构造函数能接受与容器类型不同的初始值,可将构造函数的第二个参数改为独立模板参数:
// 在myVector.h中修改构造函数声明 template<class T> class myVector { private: T *arrPtr; int storage; int currentSize; public: template <typename U> myVector(int nOfElement, U values); T& indexOfArray(int index); void printArray(); ~myVector(); }; // 在myVector.cpp中实现构造函数 template <class T> template <typename U> myVector<T>::myVector(int nOfElement, U values){ storage = nOfElement; arrPtr = new T[storage]; for (int i = 0; i < storage; i++) { arrPtr[i] = static_cast<T>(values); // 显式转换,提升安全性 } currentSize = storage; }
这种方式下,即使实例化myVector<int>,传入double值时也会先推导参数类型为double,再显式转换为int。如果需要避免截断,还可以在转换前添加合法性检查(比如判断浮点数是否为整数)。
另外,你的代码存在一个遗漏:析构函数仅声明未实现,需补充实现避免内存泄漏:
template <class T> myVector<T>::~myVector(){ delete[] arrPtr; }
内容的提问来源于stack exchange,提问作者wan carrie
相关产品推荐
相关产品推荐

