传递const引用至函数时出现类型限定符不兼容错误求解
编译错误原因:‘passing ‘const IniParser’ as ‘this’ argument discards qualifiers’
问题场景
DBConfig构造函数接收const IniParser&类型参数,函数内部通过该参数调用GetValue()方法获取配置项时,触发编译错误,IDE提示“对象类型为const IniParser,与成员函数IniParser::GetValue的类型限定符不兼容”。
相关代码片段
DBConfig构造函数
DBConfig::DBConfig(const IniParser& ini) { m_url = ini.GetValue("host"); m_user = ini.GetValue("db_user"); m_pass = ini.GetValue("db_pass"); m_schemaName = ini.GetValue("db_schema"); }
主函数调用代码
IniParser ini; DBConfig *pDBConfig = new DBConfig(ini);
IniParser::GetValue方法声明
std::string GetValue(const std::string& key, const std::string& section = "");
编译错误详情
./data_access/DBConfig.cpp: In constructor ‘DBConfig::DBConfig(const IniParser&)’: ./data_access/DBConfig.cpp:6:36: error: passing ‘const IniParser’ as ‘this’ argument discards qualifiers [-fpermissive] m_url = ini.GetValue("host"); ^ In file included from ./data_access/DBConfig.h:4:0, from ./data_access/DBConfig.cpp:1: /home/vagrant/cpp/libhv/build/include/hv/iniparser.h:31:17: note: in call to ‘std::__cxx11::string IniParser::GetValue(const string&, const string&)’ std::string GetValue(const std::string& key, const std::string& section = "");
错误原因
C++核心规则:const修饰的对象/引用只能调用被声明为const的成员函数。
构造函数中的ini是const IniParser&类型的常量引用,编译器会强制限制它只能调用那些不会修改对象内部状态的成员函数。而你的GetValue方法没有被标记为const,编译器默认认为这个函数可能会修改IniParser的内部数据,因此不允许通过const对象调用它,这就导致了“丢弃限定符”的错误——因为调用非const函数会试图去掉对象的const属性,这是C++不允许的行为。
解决方法
修改IniParser::GetValue的声明,添加const限定符,明确该函数不会修改对象状态:
std::string GetValue(const std::string& key, const std::string& section = "") const;
同时,对应的函数实现也必须加上const关键字:
std::string IniParser::GetValue(const std::string& key, const std::string& section) const { // 原实现逻辑,确保不修改任何成员变量 }
内容的提问来源于stack exchange,提问作者user63898
相关产品推荐
相关产品推荐

