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

创建动态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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:36:04