基于std::vector自定义vector类时构造函数报错的问题咨询
构造函数中初始化std::vector成员的错误原因及修复方法
错误代码
#include<vector> template<typename T> class vec { public: vec(unsigned int size){vec_(size);} private: std::vector<T> vec_; }; int main(int argc, char* argv[]) { vec<int> v1(3); return 0; }
报错信息
error: no match for call to ‘(std::vector<int, std::allocator
>) (unsigned int&)’
| vec(unsigned int size){vec_(size);}
错误原因
你在构造函数体中写vec_(size)的操作是错误的:
- 类成员
vec_会在构造函数体执行之前完成默认初始化,也就是创建了一个空的std::vector对象。 - 之后你在函数体里写
vec_(size),编译器会认为你试图调用这个vector对象的函数调用运算符operator(),但std::vector根本没有提供这个重载运算符,因此编译器找不到匹配的调用,直接报错。
修复方案
有两种合法的方式实现你的需求:
1. 使用成员初始化列表(推荐,更高效)
直接在构造函数初始化阶段调用std::vector的带大小参数的构造函数来初始化vec_,避免先默认初始化再修改的开销:
#include<vector> template<typename T> class vec { public: vec(unsigned int size) : vec_(size) {} private: std::vector<T> vec_; }; int main(int argc, char* argv[]) { vec<int> v1(3); return 0; }
2. 在构造函数体中调用resize方法
如果需要在构造函数体里执行其他逻辑后再调整vector大小,可以调用std::vector的resize成员函数:
#include<vector> template<typename T> class vec { public: vec(unsigned int size) { vec_.resize(size); } private: std::vector<T> vec_; }; int main(int argc, char* argv[]) { vec<int> v1(3); return 0; }
内容的提问来源于stack exchange,提问作者Antonella Longo
相关产品推荐
相关产品推荐

