2014-04-03 55 views
5

我有一個非常愚蠢的問題(我認爲)。很長一段時間沒有用C++編碼,但我無法弄清楚這個問題。 我有這個類:C++從'const type * const'無效轉換爲'type *'

#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文檔,我看到QList::contains的類型爲bool QList::contains(const T & value) const所以它應該沒問題吧?我的意思是,它需要一個const Node*const Node* const就是一個特例,所以...... 通過消除const在siganture結束,它編譯...

謝謝!

+0

你傳遞它需要一個參考指針。 – OMGtechy

+0

@OMGtechy,對指針的引用。 – chris

+0

'const T&'當'T'是'Node *'時表示'Node * const&',而不是'const Node *&'。 – chris

回答

4

問題是在這裏:

n->_adjacent.contains(this) 

由於包含假定它會得到Node* constthisconst Node*類型。添加const不是問題,但刪除是一個問題。因此,嘗試const_cast這樣的:

n->_adjacent.contains(const_cast<Node* const>(this)) 
+0

謝謝,這工作。我認爲'this'的類型是'const Node * const',這是我最初的錯誤。 – ddeunagomez

1

在你的「isConnectedTo」函數中,「this pointer」是一個const Node * const指針,意思是「this」不能用來改變它引用的Node對象的內容。在您的調用「n - > _ adjacent.contains(this)」中,您將「this」指針傳遞給具有常量參考參數(const T & ref,其中T是Node *)的函數。 const T & ref其中T是節點*意味着ref是節點* const &,即對指針的常量引用。這裏的常量指的是指針,意味着引用不能用來改變指針。但是,這並不意味着引用不能用於更改指針指向的對象(節點)。所以沒有什麼能阻止我們做類似(* ref).call_to_non_const_function_in_Node的事情。

但你的情況下的「this」指針指向一個常量Node對象。這就是爲什麼這個代碼不能編譯。如果參數是一個常量Node * const &,即對常量指針的常量引用,它會編譯。當您從成員函數中刪除const修飾符時,「this」只是一個常規的Node * const指針,這就是爲什麼它編譯。

0

如果您不打算通過_adjacent列表更改Node S,改變其聲明

QList<const Node*> _adjacent; 

否則你可能不得不求助於const_cast,或者從你的函數刪除const預選賽。

相關問題