自定义myVector模板类push_back传int参数出现无匹配函数报错
问题重现
实现自定义模板类myVector模拟std::vector时,调用push_back(100)出现编译错误:
no instance of function template "myVector<T>::push_back [with T=int]" matches the argument listC/C++(304) CustomContainer.cpp(112, 13): argument types are: (int) CustomContainer.cpp(112, 13): object type is: myVector<int>
以及no matching function for call to 'myVector::push_back(int)'。
核心错误代码片段:
template <typename T> class myVector { // ... 其他成员 ... template <typename C> void push_back(T value) { if(my_size < capacity) { capacity = ceil((double)capacity * 1.5); C* temp = new C[capacity]; std::copy(std::begin(arr), std::end(arr), std::begin(temp)); delete arr; arr = temp; temp = NULL; my_size++; } arr[my_size++] = value; } }; int main() { myVector<int> poggers; poggers.push_back(100); // 编译报错 }
错误原因
你的push_back被定义成了成员模板函数(带template <typename C>),但调用时编译器无法推导模板参数C——函数参数里没有用到C,也没显式指定C的类型,因此找不到匹配的函数实例。
单独写void push_back(int value)时,编译器会优先匹配这个非模板函数,所以错误消失,但这只是临时方案,无法适配泛型类型。
修复方案
去掉push_back的多余模板参数C,整个类已经是基于T的模板类,存储元素类型就是T,不需要额外模板参数。同时修正push_back里的逻辑错误:
// 修正后的push_back void push_back(const T& value) // 改用const引用避免大对象拷贝 { // 原判断写反了,元素数量等于容量时才需要扩容 if(my_size >= capacity) { // 用整数运算替代浮点计算,避免精度问题 capacity = capacity + capacity / 2; T* temp = new T[capacity]; // 拷贝原有元素,数量是my_size而非整个数组 std::copy(arr, arr + my_size, temp); delete[] arr; // 原代码漏了[],会导致内存泄漏 arr = temp; } arr[my_size++] = value; }
类设计改进建议
简化成员变量初始化:类内已经默认初始化
my_size = 0和capacity = 1,无参构造函数里的重复赋值可以删掉:myVector() { arr = new T[capacity]; // 直接用类内初始化的capacity值 }修复fill_n参数错误:第三个构造函数里
std::fill_n(*arr, new_cap, content)是错的,*arr是第一个元素的值,应该传指针arr:std::fill_n(arr, new_cap, content);补充拷贝控制函数:当前类没有实现拷贝构造和赋值运算符,会导致浅拷贝问题(多个对象共享内存,销毁时重复释放),必须补充:
// 拷贝构造 myVector(const myVector& other) { my_size = other.my_size; capacity = other.capacity; arr = new T[capacity]; std::copy(other.arr, other.arr + my_size, arr); } // 赋值运算符 myVector& operator=(const myVector& other) { if(this != &other) { delete[] arr; my_size = other.my_size; capacity = other.capacity; arr = new T[capacity]; std::copy(other.arr, other.arr + my_size, arr); } return *this; }优化成员变量类型:
my_size和capacity用size_t更合适(无符号整数,符合容器大小语义),避免负数问题。扩容逻辑优化:原代码用
ceil((double)capacity *1.5)可能导致精度丢失,用整数运算capacity += capacity/2更安全,或者直接capacity *= 2(std::vector通常用2倍扩容)。push_back参数优化:重载右值引用版本
push_back(T&& value),实现移动语义,进一步提升性能。
内容的提问来源于stack exchange,提问作者Shadows_Puppet

