为何C++使用vector的push_back时出现重载函数参数列表不匹配错误
报错原因
你的std::vector<StudyModule*>存储的是指向非const的StudyModule指针,而addModules方法的入参module是const StudyModule&类型,对它取地址得到的是const StudyModule*类型,两种指针类型不匹配,因此push_back找不到符合参数列表的重载函数。
可行修复方案
- 方案1:修改vector的存储类型,改为存储const指针
如果业务逻辑中不需要通过vector里的指针修改StudyModule实例,直接修改成员变量定义即可:std::vector<const StudyModule*> modules; - 方案2:去除入参的const修饰
如果确认后续需要修改vector中存储的StudyModule实例,调整addModules方法的入参定义:// 类内声明修改 void addModules(StudyModule& module); // 类外实现对应修改 void StudentData::addModules(StudyModule& module) { this->modules.push_back(&module); } - 方案3:存储对象而非指针(更推荐,可避免野指针问题)
如果不需要多态特性,直接存储StudyModule实例更安全,不需要手动管理内存,也不会出现类型匹配问题:// 成员变量修改 std::vector<StudyModule> modules; // addModules实现修改 void StudentData::addModules(const StudyModule& module) { this->modules.push_back(module); }
注意:当前用指针存储的方式还存在生命周期风险,如果入参module是栈上临时对象,后续vector里存的指针会变成野指针,引发未定义行为,优先考虑方案3更安全。
内容的提问来源于stack exchange,提问作者Dinnea
相关产品推荐
相关产品推荐

