将“const ...”作为“this”参数传递会丢弃限定符
Passing ‘const ...’ as ‘this’ argument discards qualifiers
我卡住了。当尝试通过迭代器将新元素添加到结构内的字符串向量时,我收到有关 const
限定符的错误:
error: passing ‘const std::vector<std::__cxx11::basic_string<char> >’ as ‘this’ argument discards qualifiers [-fpermissive]
175 | p->children.push_back("New child");
代码:
typedef struct Concept_tree
{
string id;
string name;
std::vector<string> children;
bool operator==(const Concept_tree &ct2)
{
return (id == ct2.id);
}
Concept_tree() { };
Concept_tree(string id): id(id) { };
Concept_tree(string id, string term): id(id), name(term) { };
}
Concept_tree;
namespace std
{
template<>
struct hash<Concept_tree>
{
size_t operator()(const Concept_tree &ct) const
{
return std::hash<string>()(ct.id);
}
};
}
...
std::unordered_set<Concept_tree> ct_uset;
...
string test = "id00001";
auto p = ct_uset.find(test);
p->children.push_back("New child");
我明白错误的原因,但无法推断出它的确切位置。是不是构造函数实现不当?有人能帮忙吗?
您从 unordered_set
获得了迭代器 p
; unordered_set
的内容是不可变的(以避免违反不变量),返回的迭代器是元素的 const
视图以确保。
您可以将 children
标记为 mutable
这样即使 Concept_tree
是 const
也可以改变它(因为它不是 equality/hash 计算的一部分,这可能没问题)。但这将使 children
发生变异成为可能,即使您 想要 一个 Concept_tree
在逻辑上是常量。为避免这种情况,您可以使用 unordered_map
映射 just 将 id
(不可变键)映射到实际的 Concept_tree
(可变值)对象。
旁注:您可能想将 operator==
标记为 const
,因此 this
是 const,或者使它成为非成员函数,每个 [= 的参数都为 const 26=].
我卡住了。当尝试通过迭代器将新元素添加到结构内的字符串向量时,我收到有关 const
限定符的错误:
error: passing ‘const std::vector<std::__cxx11::basic_string<char> >’ as ‘this’ argument discards qualifiers [-fpermissive]
175 | p->children.push_back("New child");
代码:
typedef struct Concept_tree
{
string id;
string name;
std::vector<string> children;
bool operator==(const Concept_tree &ct2)
{
return (id == ct2.id);
}
Concept_tree() { };
Concept_tree(string id): id(id) { };
Concept_tree(string id, string term): id(id), name(term) { };
}
Concept_tree;
namespace std
{
template<>
struct hash<Concept_tree>
{
size_t operator()(const Concept_tree &ct) const
{
return std::hash<string>()(ct.id);
}
};
}
...
std::unordered_set<Concept_tree> ct_uset;
...
string test = "id00001";
auto p = ct_uset.find(test);
p->children.push_back("New child");
我明白错误的原因,但无法推断出它的确切位置。是不是构造函数实现不当?有人能帮忙吗?
您从 unordered_set
获得了迭代器 p
; unordered_set
的内容是不可变的(以避免违反不变量),返回的迭代器是元素的 const
视图以确保。
您可以将 children
标记为 mutable
这样即使 Concept_tree
是 const
也可以改变它(因为它不是 equality/hash 计算的一部分,这可能没问题)。但这将使 children
发生变异成为可能,即使您 想要 一个 Concept_tree
在逻辑上是常量。为避免这种情况,您可以使用 unordered_map
映射 just 将 id
(不可变键)映射到实际的 Concept_tree
(可变值)对象。
旁注:您可能想将 operator==
标记为 const
,因此 this
是 const,或者使它成为非成员函数,每个 [= 的参数都为 const 26=].