Подтвердить что ты не робот

Использование std::string в качестве ключа для std:: map

Я хотел бы иметь std:: map (int.NET 4.0). Мы, конечно, знаем, что карта является деревом и требует оператора < эта строка для нас не определена.

Ошибка 24 ошибки C2676: двоичный '<': 'const std::string' не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора. c:\program files\microsoft visual studio 10.0\vc\include\xfunctional 125 1 FXCMMarketDataServer

Итак, я положил свой google-foo на работу и нашел это решение:

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

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

Это сработало хорошо, и теперь я сталкиваюсь с ошибкой, которая, как мне кажется, связана с этим. Где-то в глубине структуры STL казалось бы, что он игнорирует приведенное выше определение и по умолчанию использует оператор <.

Есть ли способ в VS2010.NET 4.0 использовать строку в качестве ключа карты?

Я понимаю, что я могу взять эту строку и написать функцию для хэша для int, но где это весело?

ИЗМЕНИТЬ

Я попытаюсь объяснить это как можно лучше для Дэвида. Когда на карте используется структура сравнения, она выходит из строя в выпуске и не выполняет отладочное утверждение при отладке. Утверждение, которое терпит неудачу, находится в xtree строке 1746.

Выражение: неверный оператор <

| Прервать | | Повторить | | Игнорировать |

Вот что заставляет меня поверить, что, несмотря на то, что карта сопоставлена, она по-прежнему оставляет определенные пути по умолчанию для оператора < для сравнения. Строка в моем коде, которая вызывает это:

CustomObject o = stringObjectMap[key];
4b9b3361

Ответ 1

Ошибка 24 ошибки C2676: двоичный '<': 'const std::string' не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора. c:\program files\microsoft visual studio 10.0\vc\include\xfunctional 125 1 FXCMMarketDataServer

То, что VC плюет вам в лицо, когда вы забыли включить <string>. Этот заголовок определенно определяет этот оператор.