我有一个非常愚蠢的问题(我认为)。很长一段时间不用C ++编写代码,但我无法弄清楚这个问题。 我有这门课:
#include <QList>
class Node {
private:
QList<Node*> _adjacent;
public:
Node();
bool isConnectedTo(Node* n) const;
};
以及isConnectedTo()
的实施:
bool Node::isConnectedTo(Node* n) const{
return _adjacent.contains(n) && n->_adjacent.contains(this);
}
我在return
行中收到以下错误:
Node.cpp: In member function ‘const bool Node::isConnectedTo(Node*) const’:
Node.cpp:25:60: error: invalid conversion from ‘const Node* const’ to ‘Node*’ [-fpermissive]
In file included from /usr/include/qt5/QtCore/QList:1:0,
from Node.hpp:5,
from Node.cpp:1:
/usr/include/qt5/QtCore/qlist.h:913:27: error: initializing argument 1 of ‘bool QList<T>::contains(const T&) const [with T = Node*]’ [-fpermissive]
我认为,由于该方法是常量,因此this
的类型为const Node* const
。
通过阅读Qt doc,我发现QList::contains
的类型为bool QList::contains(const T & value) const
所以它应该没问题,对吧?我的意思是,需要一个const Node*
,而const Node* const
是一个特例,所以...
通过删除siganture末尾的const
,它会编译......
谢谢!
答案 0 :(得分:5)
问题出在这里:
n->_adjacent.contains(this)
由于contains假定它将获得Node* const
而this
的类型为const Node*
。添加const
不是问题,但删除是一个问题。所以请尝试const_cast
,如下所示:
n->_adjacent.contains(const_cast<Node* const>(this))
答案 1 :(得分:1)
在“isConnectedTo”函数中“this pointer”是一个const Node * const指针,这意味着“this”不能用于更改它所引用的Node对象的内容。
在你的调用“n-&gt; _adjacent.contains(this)”中,你将“this”指针传递给一个具有常量引用参数的函数(const T&amp; ref,其中T是Node *)。 const T&amp; ref其中T是Node *表示ref是Node * const&amp;即对指针的恒定引用。这里的常量指的是指针,意味着参考不能用来改变指针。但这并不意味着引用不能用于更改指针指向的对象(Node)。所以没有什么可以阻止我们做像(* ref).call_to_non_const_function_in_Node这样的事情。
但是你的情况下“this”指针指向一个常量的Node objject。这就是为什么这段代码不能编译。如果参数是常量Node * const&amp;即对指向常量
的指针的常量引用当你从你的成员函数中删除const修饰符时,“this”只是一个常规的Node * const指针,这就是它编译的原因。
答案 2 :(得分:0)
如果您不打算通过Node
列表更改_adjacent
,请将其声明更改为
QList<const Node*> _adjacent;
否则您可能不得不诉诸const_cast
,或从您的函数中移除const
限定符。