2012-06-11 21 views
40

Trong khi viết hàm sau abs, tôi nhận được lỗi:chức năng phi thành viên không thể có cv-vòng loại

phi thành viên chức năng unsigned int abs(const T&) không thể có cv-vòng loại.

template<typename T> 
inline unsigned int abs(const T& t) const 
{ 
    return t>0?t:-t; 
} 

Sau khi xóa const vòng loại cho hàm không có lỗi. Vì tôi không sửa đổi t bên trong hàm nên mã trên phải được biên dịch. Tôi tự hỏi tại sao tôi bị lỗi?

Trả lời

84

Mong muốn của bạn không sửa đổi t được thể hiện trong const T& t. Kết thúc const chỉ định rằng bạn sẽ không sửa đổi bất kỳ biến thành viên nào của lớp học abs thuộc về. Vì không có lớp nào mà hàm này thuộc về, bạn gặp lỗi

30

Công cụ sửa đổi const ở cuối khai báo hàm áp dụng cho tham số ẩn this cho các hàm thành viên.

Vì đây là một chức năng miễn phí, không có this và trình sửa đổi đó là không cần thiết.

Thông số t đã có số const riêng trong danh sách tham số.

12

Các cv-vòng loại trên một hàm thành viên xác định rằng con trỏ this là đã indirected loại const (hoặc volatile, const volatile) và do đó hàm thành viên có thể được gọi vào trường hợp có trình độ đó.

Chức năng miễn phí (và các hàm tĩnh lớp) không có con trỏ this.

1

Như chúng ta đều biết, từ khóa const được theo sau danh sách đối số cho biết đây là con trỏ đến hằng số con trỏ.

Có chức năng không phải là thành viên, nó không thuộc về lớp, vì vậy thêm lỗi kết thúc ngược lại xảy ra.

Giải pháp cho vấn đề: là một trong hai trở thành một chức năng thành viên lớp hoặc loại bỏ các const từ khóa const cuối đối diện

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