2010-03-04 42 views
9

Đối với lớp compsci của tôi, tôi đang thực hiện một Stack mẫu lớp, nhưng đã chạy vào một lỗi lẻ:loại bỏ vòng loại lỗi

Stack.h: In member function ‘ const T Stack<T>::top() const [with T = int]’:

Stack.cpp:10: error: passing ‘ const Stack<int> ’ as ‘ this ’ argument of ‘ void Stack<T>::checkElements() [with T = int]’ discards qualifiers

Stack<T>::top() trông như thế này:

const T top() const { 
    checkElements(); 
    return (const T)(first_->data); 
} 

Stack<T>::checkElements() trông như thế này :

void checkElements() { 
    if (first_==NULL || size_==0) 
     throw range_error("There are no elements in the stack."); 
} 

Ngăn xếp sử dụng nút được liên kết để lưu trữ, vì vậy first_ là một con trỏ đến nút đầu tiên.

Tại sao tôi gặp phải lỗi này?

Trả lời

20

Chức năng checkElements() của bạn không được đánh dấu là const do đó bạn không thể gọi nó trên const đối tượng đủ điều kiện.

top(), tuy nhiên là const có trình độ như vậy trong top(), this là một con trỏ đến một const Stack (ngay cả khi Stack ví dụ mà top() được gọi là sẽ xảy ra là phi const), do đó bạn không thể gọi checkElements()luôn luôn yêu cầu phiên bản không phải là const.

13

Bạn không thể gọi phương thức không const từ phương thức const. Điều đó sẽ 'hủy' giới hạn số const. Về cơ bản nó có nghĩa là nếu nó cho phép bạn gọi phương thức, thì nó có thể thay đổi đối tượng, và điều đó sẽ phá vỡ lời hứa không sửa đổi đối tượng mà const ở cuối chữ ký phương thức cung cấp.

4

Bạn đang gọi phương thức không phải là const từ phương thức const.

2

Vì checkElements() không được khai báo const.

void checkElements() const { 
    if (first_==NULL || size_==0) 
     throw range_error("There are no elements in the stack."); 
} 

Nếu không có khai báo đó, hãy kiểm traCác khoản phí không thể được gọi trên đối tượng const.

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