2009-05-25 31 views
23

Tôi đang cố gắng chỉ định loại tùy chỉnh làm khóa cho std :: map. Đây là loại mà tôi đang sử dụng làm khóa.Loại tùy chỉnh làm khóa cho bản đồ - C++

struct Foo 
{ 
    Foo(std::string s) : foo_value(s){} 

    bool operator<(const Foo& foo1) { return foo_value < foo1.foo_value; } 

    bool operator>(const Foo& foo1) { return foo_value > foo1.foo_value; } 

    std::string foo_value; 
}; 

Khi sử dụng với std :: map, tôi nhận được lỗi sau.

error C2678: binary '<' : no operator found which takes a left-hand operand of type 'const Foo' (or there is no acceptable conversion) c:\program files\microsoft visual studio 8\vc\include\functional 143 

Nếu tôi thay đổi cấu trúc như dưới đây, mọi thứ đã hoạt động.

struct Foo 
{ 
    Foo(std::string s) : foo_value(s) {} 

    friend bool operator<(const Foo& foo,const Foo& foo1) { return foo.foo_value < foo1.foo_value; } 

    friend bool operator>(const Foo& foo,const Foo& foo1) { return foo.foo_value > foo1.foo_value; } 

    std::string foo_value; 
}; 

Không có gì thay đổi ngoại trừ việc quá tải nhà điều hành là bạn bè. Tôi tự hỏi tại sao mã đầu tiên của tôi không hoạt động?

Mọi suy nghĩ?

Trả lời

32

tôi nghi ngờ bạn cần

bool operator<(const Foo& foo1) const; 

Lưu ý const sau khi tranh luận, điều này là để đảm (phía bên trái trong sự so sánh) "bạn" đối tượng liên tục.

Lý do chỉ cần một toán tử duy nhất là đủ để thực hiện yêu cầu bắt buộc. Để trả lời câu hỏi trừu tượng "có phải đến trước b?" nó là đủ để biết liệu một nhỏ hơn b.

+0

Cảm ơn. Điều đó đã làm các trick. –

+0

Bạn có thể đi vào chi tiết hơn không? Tại sao bạn chỉ cần toán tử ? – bobobobo

+14

vì bạn có thể lấy được toán tử> và toán tử == từ toán tử <. '(b b)', vì vậy có toán tử>. và, '(! (A skrebbel

3

Có thể tìm kiếm toán tử thành viên const (bất kể tên chính xác là gì). này hoạt động (lưu ý const):

bool operator<(const Foo& foo1) const { return foo_value < foo1.foo_value;} 

EDIT: xóa operator> từ câu trả lời của tôi như nó đã không cần thiết (copy/paste từ câu hỏi) nhưng nó đã thu hút ý kiến ​​:)

Lưu ý: Tôi 100% chắc chắn rằng bạn cần rằng const vì tôi đã biên soạn ví dụ.

+2

Bạn không cần> –

+0

Stackoverflow vui cho thấy câu trả lời trước 10 phút trước nhưng khi tôi gửi câu trả lời của tôi chưa có bất kỳ câu trả lời nào ... do đó cùng một câu trả lời – stefanB

+0

Vì đối tượng là hàm const hằng số sẽ được yêu cầu. – siddhusingh

0

Lưu ý const sau đối số, điều này là để làm cho "của bạn" (phía bên tay trái trong so sánh) đối tượng liên tục.

Bạn có thể giải thích về điều này không? Tại sao nếu bạn tạo thành viên const (theo như tôi biết có nghĩa là nó không thể thay đổi trạng thái của đối tượng - ví dụ: sửa đổi các biến riêng) đảm bảo rằng "của bạn" sẽ là phía bên trái?

0

Bạn có thể giải thích về điều này không? Tại sao nếu bạn tạo thành viên const (theo như tôi biết có nghĩa là nó không thể thay đổi trạng thái của đối tượng - ví dụ: sửa đổi các biến riêng) đảm bảo rằng "của bạn" sẽ là phía bên tay trái?

Tôi chưa có đại diện để nhận xét về điều này.

const không kỳ diệu đảm bảo rằng "của bạn" sẽ là phía bên tay trái. Người đăng nói rằng phía bên tay trái (tức là x trong x < y) là đối tượng mà trên đó việc so sánh được gọi. Cũng giống như bạn bảo vệ các thành viên của y khỏi thay đổi với const trên đối số cho toán tử <, bạn cũng muốn bảo vệ các thành viên của x khỏi thay đổi với const ở cuối chữ ký phương thức.

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