2011-02-08 16 views
23

Chciałbym mieć std :: map (int .NET 4.0). Wiemy oczywiście, że mapa jest drzewem i wymaga operatora <, którego ten ciąg nie definiuje dla nas.Używanie std :: string jako klucza do std :: map

Error 24 error C2676: binarny '<': 'const std :: string' nie definiuje tego operatora lub konwersji do typu dopuszczalny do ustawionej operatora c: \ program files \ Microsoft visual studio 10.0 \ VC \ include \ xfunctional 125 1 FXCMMarketDataServer

więc kładę moje google-foo do pracy i znaleźć tego rozwiązania:

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

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

Ten pracował dobrze przez jakiś czas, a teraz jestem napotyka błąd co moim zdaniem wynika z tego. Gdzieś w głębi ramy STL wydaje się, że ignoruje powyższą definicję i domyślnie jest operatorem <.

Czy w VS2010 .NET 4.0 jest sposób na użycie ciągu znaków jako klucza mapy?

Rozumiem, że mogę wziąć ten ciąg znaków i napisać funkcję, aby zaszyfrować ją do int, ale gdzie jest zabawa?

EDIT

Postaram się wyjaśnić to najlepiej jak potrafię dla Dawida. Kiedy mapa używa struktury porównawczej, ulega awarii w czasie wydawania i nie działa asercja debugowania w debugowaniu. Assert, który nie jest zgodny xtree 1746.

Expression: nieprawidłowy operator <

| Abort | | Spróbuj ponownie | Ignoruj ​​|

To prowadzi mnie do przekonania, że ​​pomimo nadania mapie porównywarki, nadal niektóre ścieżki domyślnie obsługują operatora < dla porównania. Linia w moim kodu, który powoduje, że jest to:

CustomObject o = stringObjectMap[key]; 
+7

std :: string ma odpowiednią definicję wymaganego operatora. Czy jesteś pewien, że zawarłeś nagłówek ? Myślę, że widziałem podobne problemy, gdy nie udało mi się go włączyć; forward deklaruje, że std :: string oznacza, że ​​znana jest jego nazwa. – Keith

+3

.NET nie ma nic wspólnego ze std :: map lub std :: string –

+3

Co sprawia, że ​​myślisz, że głęboko w warstwach biblioteki domyślnie jest '

Odpowiedz

67

Error 24 error C2676: binarny '<': 'const std :: string' nie definiuje tego operatora lub konwersji do typu do zaakceptowania przez predefiniowane operator c: \ program files \ Microsoft visual Studio 10.0 \ vc \ include \ xfunctional 125 1 FXCMMarketDataServer

to właśnie VC pluje w twarz, gdy użytkownik zapomniał włączyć <string>. Ten nagłówek definitywnie definiuje tego operatora.

+1

To mi się właśnie przydarzyło, spędziłem godzinę grając z mapami i ciągle dostaję tego błędu. Pomyślałem: "Dlaczego każdy przykład w Internecie zawiedzie!". Okazuje się, że zapomniałem o nagłówku napisu. Czuję się teraz trochę głupio ... – Joseph

Powiązane problemy