C++ error: passing ‘const umap_int {aka const std::unordered_map<int, int>}’ as ‘this’ argument discards qualifiers [-fpermissive]
C++ error: passing ‘const umap_int {aka const std::unordered_map<int, int>}’ as ‘this’ argument discards qualifiers [-fpermissive]
我正在尝试通过一种方法获取 unordered_map 的映射值的常量引用。 unordered_map 是 class 成员。但是,下面的代码不起作用并引发标题中所述的错误。
我尝试将 const umap_int::mapped_type &
更改为 const int &
,但也没有用。返回对简单数据类型 (int, double, ...) 变量的 const 引用的标准示例有效。
#include <unordered_map>
using namespace std;
typedef unordered_map<int, int> umap_int;
class class_A{
public:
class_A(){
for(int k=0; k<3;++k)
M[k] = k;
}
const umap_int::mapped_type & get_M(int key) const{
return M[key];
}
private:
umap_int M;
};
int main(){
class_A A;
return 0;
}
在 const 方法中你只能调用 M
它的 const 成员函数。两个 unordered_map::operator[]
重载都是 non-const - reference。所以你不能在 const get_M
中使用它。您可以从 get_M
签名中删除 const 限定符,或者使用具有 const 重载的 find
但是您需要处理映射值不存在的情况传递的密钥:
const umap_int::mapped_type & get_M(int key) const {
//return M[key];
auto it = M.find(key);
if (it != M.end())
return it->second;
// do sth here ...
// throw exception
// make static variable with default value which will be accessed
}
我正在尝试通过一种方法获取 unordered_map 的映射值的常量引用。 unordered_map 是 class 成员。但是,下面的代码不起作用并引发标题中所述的错误。
我尝试将 const umap_int::mapped_type &
更改为 const int &
,但也没有用。返回对简单数据类型 (int, double, ...) 变量的 const 引用的标准示例有效。
#include <unordered_map>
using namespace std;
typedef unordered_map<int, int> umap_int;
class class_A{
public:
class_A(){
for(int k=0; k<3;++k)
M[k] = k;
}
const umap_int::mapped_type & get_M(int key) const{
return M[key];
}
private:
umap_int M;
};
int main(){
class_A A;
return 0;
}
在 const 方法中你只能调用 M
它的 const 成员函数。两个 unordered_map::operator[]
重载都是 non-const - reference。所以你不能在 const get_M
中使用它。您可以从 get_M
签名中删除 const 限定符,或者使用具有 const 重载的 find
但是您需要处理映射值不存在的情况传递的密钥:
const umap_int::mapped_type & get_M(int key) const {
//return M[key];
auto it = M.find(key);
if (it != M.end())
return it->second;
// do sth here ...
// throw exception
// make static variable with default value which will be accessed
}