C ++无效转换为'const type * const'到'type *'

时间:2014-04-03 12:11:37

标签: c++ qt

我有一个非常愚蠢的问题(我认为)。很长一段时间不用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,它会编译......

谢谢!

3 个答案:

答案 0 :(得分:5)

问题出在这里:

n->_adjacent.contains(this)

由于contains假定它将获得Node* constthis的类型为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限定符。