gpt4 book ai didi

c++ - 候选函数不可行 : 1st argument ('const Node *' ) would lose const qualifier

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:00 26 4
gpt4 key购买 nike

我正在使用内置的 C++ 编写有向图(有向图)类 unordered_map<Node*, unordered_set<Edge>>数据结构,其中 Node 和 Edge 是我自己定义的两个结构体。在类里面我写了一个 containsNode()搜索 Node 的方法在图中。这是 containsNode()方法体:

bool DiGraph::containsNode(const Node * n) const {
auto::const_iterator it = digraph.find(n);
return (it == digraph.end());
}

digraphunordered_map<Node*, unordered_set<Edge>> 类型的 DiGraph 的私有(private)成员.

但是,编译器会生成以下错误:

error: no matching member function for call to 'find'
auto::const_iterator it = digraph.find(n);
candidate function not viable: 1st argument ('const Node *') would lose const qualifier
const_iterator find(const key_type& __k) const {return __t...

但是,如果我将方法声明为 bool DiGraph::containsNode(Node* n) const {...} (唯一的区别是从参数列表中删除了 const 关键字)然后就没有编译错误了。

我查看了 C++ 文档,发现 find() unordered_map 中的方法声明容器有 const关键词:

std::unordered_map::find
const_iterator find(const Key& key) const;

因此我认为不应该有编译错误,那么为什么我会得到一个呢?

最佳答案

find() 看起来像这样: find(const T& key) 如果 TNode*,那么 Node* 必须是 const。但请注意,指针 必须是const,而不是containsNode(const Node * n) 所指向的值。 find() 不保证 n 指向的值将保持不变,这违反了 const Node * n

我的 friend ,你是对的。由于您的键指针,您可能无法使用指向值的拷贝、不同的地址,也无法将其分配给非const 指针可以被find使用。您可以强制转换,但是对于 const 的尊重就到此为止了!我的建议是重新考虑您的做法。

用集合更容易形象化。更少的开销,相同的结果。

#include <set>
using namespace std;

class A
{

};

set<A*> test;

void func1(A *const a) // pointer is const
{
test.find(a); //Compiles, but not what you want.
A b;
a = &b; // Doesn't compile. Can't change where a points
*a = b; // compiles. Value at a is open game
}

void func2(const A * a) // value is const
{
test.find(a); //doesn't compile
A b;
a = &b; // compiles. Can change where a points
*a = b; // does not compile. Can't change what a points at
test.find((A*)a); //Compiles, but holy super yuck! Find a better way!
}

int main()
{
A a;
func1(&a);
func2(&a);
}

关于c++ - 候选函数不可行 : 1st argument ('const Node *' ) would lose const qualifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31664415/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com