2011-02-08 34 views
23

Tôi muốn có một std :: map (int .NET 4.0). Tất nhiên chúng ta biết rằng một bản đồ là một cái cây và yêu cầu một toán tử < mà chuỗi đó không xác định cho chúng ta.Dùng std :: string làm khóa cho std :: map

Lỗi 24 lỗi C2676: binary '<': 'const std :: string' không xác định toán tử này hoặc chuyển đổi thành kiểu được chấp nhận cho toán tử được xác định trước c: \ program files \ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 FXCMMarketDataServer

vì vậy, tôi đưa tôi google-foo để làm việc và tìm thấy giải pháp này:

struct StringComparerForMap 
{ 
public: 
    bool operator()(const std::string x, const std::string y) 
    { 
     // Add compare logic here 
    } 
}; 

... 
std::map<std::string, CustomObject, StringComparerForMap> myMap; 

này làm việc tốt cho một thời gian, và bây giờ tôi đang gặp phải một lỗi mà tôi tin là do điều này. Một nơi nào đó sâu trong khuôn khổ STL có vẻ như nó bỏ qua định nghĩa trên và mặc định cho nhà điều hành <.

Có cách nào trong VS2010 .NET 4.0 sử dụng chuỗi làm khóa của bản đồ không?

Tôi hiểu rằng tôi có thể lấy chuỗi đó và viết một hàm để băm nó thành một int, nhưng đâu là niềm vui trong đó?

EDIT

tôi sẽ cố gắng và giải thích điều này một cách tốt nhất tôi có thể cho David. Khi bản đồ sử dụng cấu trúc so sánh, nó đổ vỡ trong bản phát hành và không thực hiện xác nhận gỡ rối khi gỡ lỗi. Các khẳng định rằng thất bại là phù hợp xtree 1746.

Biểu hiện: không hợp lệ điều hành <

| Abort | | Thử lại | | Bỏ qua |

Đó là điều khiến tôi tin rằng mặc dù cho bản đồ so sánh, nhưng vẫn còn một số đường dẫn mặc định cho nhà điều hành < để so sánh. Các dòng trong mã của tôi gây ra đây là:

CustomObject o = stringObjectMap[key]; 
+7

std :: chuỗi không có định nghĩa phù hợp về toán tử được yêu cầu. Bạn có chắc chắn bạn đã bao gồm tiêu đề không? Tôi nghĩ rằng tôi đã thấy các vấn đề tương tự khi tôi không bao gồm nó; chuyển tiếp tuyên bố của std :: string có nghĩa là tên của nó chính nó được biết đến. – Keith

+3

.NET không liên quan gì đến std :: map or std :: string –

+3

Điều gì khiến bạn nghĩ sâu bên trong các lớp thư viện mà nó mặc định là '<'? Nếu nó là như vậy, nó sẽ bị hỏng và bạn nên gửi báo cáo lỗi, nhưng có lẽ bạn đang hiểu sai dữ liệu - lỗi này sẽ được kích hoạt trong nhiều tình huống khác, có thể ai đó đã phát hiện ra nó trước ...Khi tôi nói với ông chủ đầu tiên của tôi rằng trình biên dịch là sai, ông mỉm cười và nói: * 99% thời gian, vấn đề nằm giữa ghế và bàn phím và không phải trong trình biên dịch * –

Trả lời

67

Lỗi 24 lỗi C2676: nhị phân '<': 'const std :: string' không định nghĩa toán tử này hoặc chuyển đổi sang một loại chấp nhận được được xác định trước điều hành c: \ program files \ microsoft visual studio 10.0 \ vc \ include \ xfunctional 125 1 FXCMMarketDataServer

Đó là những gì VC spits vào khuôn mặt của bạn khi bạn quên bao gồm <string>. Tiêu đề đó chắc chắn định nghĩa toán tử này.

+1

Điều này chỉ xảy ra với tôi, dành một giờ chơi với bản đồ và tiếp tục nhận được lỗi này hơn và hơn. Tôi nghĩ "Tại sao mọi ví dụ trên internet đều thất bại!". Hóa ra tôi đã quên một tiêu đề chuỗi darn. Tôi cảm thấy ngớ ngẩn bây giờ .... – Joseph

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