创建动态vector数组调用push_back时出现C2663错误是什么原因?
问题原因分析
1. 触发C2663编译错误的直接原因:运算符优先级错误
你代码中报错的行*cars->push_back(*car)存在运算符优先级问题:
C++ 中->成员访问运算符的优先级高于*解引用运算符,因此代码实际的执行逻辑等价于*(cars->push_back(*car))。而std::vector::push_back的返回值是void类型,对void做解引用操作完全不合法,编译器无法找到匹配的push_back重载,因此抛出对应错误。
正确写法二选一即可:
// 先解引用指针拿到vector实例,再调用成员方法 (*cars).push_back(*car); // 直接通过指针调用成员方法,无需额外解引用 cars->push_back(*car);
2. 隐藏的其他编译错误:类型声明顺序错误
你在定义全局变量std::vector<Car>* cars和std::vector<Customer>* customers时,Car和Customer两个结构体还未完成定义。C++要求使用自定义类型前必须先完成声明/定义,当前的代码顺序会额外触发未定义类型的编译错误。
修复方法是将结构体定义移到全局vector变量声明之前:
// 先定义自定义类型 struct Customer { std::string name; }; struct Car { std::string name; int year; int milage; }; // 再定义持有对应类型的vector指针 std::vector<Car>* cars = new std::vector<Car>; std::vector<Customer>* customers = new std::vector<Customer>;
3. 代码可优化点
- 无意义的堆分配:C++不需要将所有对象都放在堆上,vector、Main类实例都可以直接在栈上声明,无需手动new/delete,既避免内存泄漏,也能简化代码逻辑。
- 冗余的Car对象堆分配:你new出Car对象赋值后,push到vector就立刻delete,完全没必要,可以直接构造栈上的Car对象传入push_back,或者调用emplace_back原地构造对象,减少不必要的内存操作。
- 输入缓冲区残留问题:调用
_getch()后输入缓冲区会残留换行符,后续第一个getline会直接读取到空字符串,需要手动清空输入缓冲区处理该问题。
内容的提问来源于stack exchange,提问作者NewbCoder
相关产品推荐
相关产品推荐

