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];
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
.NET nie ma nic wspólnego ze std :: map lub std :: string –
Co sprawia, że myślisz, że głęboko w warstwach biblioteki domyślnie jest ' Gdyby tak było, byłby uszkodzony i powinieneś złożyć raport o błędzie, ale najprawdopodobniej źle zinterpretujesz dane - że błąd zostanie wywołany w wielu innych sytuacjach, ktoś prawdopodobnie wykryłby to wcześniej ...Kiedy powiedziałem mojemu pierwszemu szefowi, że kompilator się mylił, uśmiechnął się i powiedział: * 99% czasu, problem leży między krzesłem a klawiaturą, a nie w kompilatorze * –