将“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 获得了迭代器 punordered_set 的内容是不可变的(以避免违反不变量),返回的迭代器是元素的 const 视图以确保。

您可以将 children 标记为 mutable 这样即使 Concept_treeconst 也可以改变它(因为它不是 equality/hash 计算的一部分,这可能没问题)。但这将使 children 发生变异成为可能,即使您 想要 一个 Concept_tree 在逻辑上是常量。为避免这种情况,您可以使用 unordered_map 映射 justid(不可变键)映射到实际的 Concept_tree(可变值)对象。

旁注:您可能想将 operator== 标记为 const,因此 this 是 const,或者使它成为非成员函数,每个 [= 的参数都为 const 26=].