2014-04-03 20 views
5

Tôi có một câu hỏi rất ngớ ngẩn (tôi nghĩ). Nó đã được thời gian dài không mã hóa trong C + +, nhưng tôi không thể tìm ra vấn đề này. Tôi có lớp này:C++ chuyển đổi không hợp lệ từ ‘const type * const’ thành ‘type *’

#include <QList> 
class Node { 
private: 
    QList<Node*> _adjacent; 
public: 
    Node(); 
    bool isConnectedTo(Node* n) const; 
}; 

và thực hiện điều này cho isConnectedTo():

bool Node::isConnectedTo(Node* n) const{ 
    return _adjacent.contains(n) && n->_adjacent.contains(this); 
} 

và tôi nhận được lỗi sau trong dòng 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] 

Tôi nghĩ rằng, kể từ khi phương pháp là không đổi, sau đó this là loại const Node* const tại đây. Bằng cách đọc tài liệu Qt, tôi thấy rằng QList::contains có loại bool QList::contains(const T & value) const vì vậy nó phải là ok, phải không? Ý tôi là, phải mất một const Node*, và một const Node* const là một trường hợp đặc biệt về điều đó, vì vậy ... Bằng cách loại bỏ các const vào cuối của siganture, nó biên dịch ...

Cảm ơn!

+0

Bạn đang chuyển một con trỏ ở nơi nó mong muốn tham chiếu. – OMGtechy

+0

@OMGtechy, Tham chiếu đến con trỏ. – chris

+0

'const T &' khi 'T' là' Node * 'có nghĩa là' Node * const & ', không phải' const Node * & '. – chris

Trả lời

4

Vấn đề là ở đây:

n->_adjacent.contains(this) 

Kể từ chứa giả định rằng nó sẽ nhận được Node* constthis là loại const Node*. Thêm const không phải là vấn đề nhưng việc xóa là một vấn đề. Vì vậy, hãy thử const_cast như thế này:

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

Cảm ơn, điều đó đã hiệu quả. Tôi nghĩ rằng 'this' có kiểu 'const Node * const', đó là sai lầm ban đầu của tôi. – ddeunagomez

1

Bên trong hàm "isConnectedTo" "con trỏ này" là con trỏ const Node * const có nghĩa là "này" không thể được sử dụng để thay đổi nội dung của đối tượng Nút mà nó đề cập đến.

Trong cuộc gọi "n -> _ nearby.contains (this)", bạn đang chuyển con trỏ "this" đến hàm có thông số tham chiếu không đổi (const T & ref trong đó T là Node *). const T & ref trong đó T là Node * có nghĩa là ref là Node * const & tức là tham chiếu liên tục đến một con trỏ. Hằng số ở đây đề cập đến con trỏ và có nghĩa là không thể sử dụng tham chiếu để thay đổi con trỏ. Nhưng điều này không có nghĩa là không thể sử dụng tham chiếu để thay đổi đối tượng (Node) mà con trỏ trỏ đến. Vì vậy, không có gì có thể ngăn cản chúng tôi làm một cái gì đó như (* ref) .call_to_non_const_function_in_Node.

Nhưng con trỏ "this" trong trường hợp của bạn trỏ đến một objject Node không đổi. Đó là lý do tại sao mã này không biên dịch. Nó sẽ được biên dịch nếu tham số là hằng số Node * const & tức là tham chiếu hằng số cho một con trỏ đến một hằng số

Khi bạn loại bỏ const modifier khỏi hàm thành viên của bạn "this" chỉ là nút Node * const thông thường. nó biên dịch.

0

Nếu bạn không có kế hoạch thay đổi Node s qua danh sách _adjacent, thay đổi tuyên bố của mình cho

QList<const Node*> _adjacent; 

Nếu không, bạn có thể phải nghỉ mát để const_cast, hoặc loại bỏ các const vòng loại từ chức năng của bạn.

Các vấn đề liên quan