2014-04-03 9 views
5

से अमान्य रूपांतरण मेरे पास एक बहुत मूर्ख सवाल है (मुझे लगता है)। यह लंबे समय से सी ++ में कोडिंग नहीं कर रहा है, लेकिन मैं इस समस्या को समझ नहीं सकता।सी ++ 'कॉन्स्ट टाइप * कॉन्स' से 'टाइप *'

#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] 

मुझे लगता है कि, के बाद से विधि स्थिर है, तो thisconst Node* const प्रकार का है। वें क्यूटी दस्तावेज़ पढ़कर, मुझे लगता है कि QList::contains में bool QList::contains(const T & value) const है, तो यह ठीक होना चाहिए, है ना? मेरा मतलब है, यह एक const Node* लेता है, और एक const Node* const कि का एक विशेष मामला है, इसलिए ... siganture के अंत में const, यह संकलित ...

धन्यवाद हटाकर!

+0

आप एक सूचक पास कर रहे हैं जहां यह संदर्भ की अपेक्षा करता है। – OMGtechy

+0

@OMGtechy, एक पॉइंटर का संदर्भ है। – chris

+0

'टी टी '' 'टी'' नोड * 'का अर्थ है 'नोड * कॉन्स्ट एंड', नॉन नोड * और'। – chris

उत्तर

4

समस्या यहाँ है:

n->_adjacent.contains(this) 

के बाद से शामिल मानता है कि यह मिल जाएगा Node* const और thisconst Node* का प्रकार है। const जोड़ना कोई समस्या नहीं है लेकिन निकालना एक समस्या है। तो const_cast इस प्रकार की कोशिश करें:

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

धन्यवाद, यह काम किया। मैंने सोचा कि 'इस' प्रकार का 'कॉन्स नोड * कॉन्स' था, जो मेरी प्रारंभिक गलती थी। – ddeunagomez

1

अपने "isConnectedTo" फ़ंक्शन के अंदर "यह सूचक" एक कॉन्स नोड * कॉन्स पॉइंटर है जिसका अर्थ है कि "यह" नोड ऑब्जेक्ट की सामग्री को बदलने के लिए उपयोग नहीं किया जा सकता है।

आपके कॉल में "n -> _ adjacent.contains (यह)" आप "इस" पॉइंटर को एक फ़ंक्शन पर पास कर रहे हैं जिसमें निरंतर संदर्भ पैरामीटर है (कॉन्स्ट टी & रेफरी जहां टी नोड * है)। कॉन्स टी & रेफरी जहां टी नोड * का मतलब है रेफ नोड * कॉन्स & यानी एक सूचक के निरंतर संदर्भ है। यहां निरंतर सूचक को संदर्भित करता है और इसका अर्थ यह है कि संदर्भ को पॉइंटर को बदलने के लिए उपयोग नहीं किया जा सकता है। लेकिन इसका मतलब यह नहीं है कि संदर्भ ऑब्जेक्ट (नोड) को बदलने के लिए उपयोग नहीं किया जा सकता है जो सूचक इंगित करता है। तो कुछ भी हमें (* ref) .call_to_non_const_function_in_Node जैसे कुछ करने से रोक सकता है।

लेकिन आपके मामले में "यह" पॉइंटर स्थिर नोड objject के लिए इंगित करता है। यही कारण है कि यह कोड संकलित नहीं करता है। यह पैरामीटर एक स्थिर नोड * कॉन्स & यानी निरंतर

पर एक सूचक के निरंतर संदर्भ थे जब आप अपने सदस्य फ़ंक्शन से कॉन्स्ट संशोधक को हटाते हैं "यह" केवल एक नियमित नोड * कॉन्स्ट पॉइंटर होता है यह संकलित करता है।

0

आप _adjacent सूची के माध्यम से Node रों बदलने के लिए,

QList<const Node*> _adjacent; 

करने के लिए अपनी घोषणा को बदलने की योजना नहीं बना रहे हैं, तो नहीं तो आप शायद const_cast का सहारा, या अपने समारोह से const क्वालीफायर निकालना होगा।

संबंधित मुद्दे