Я хотел бы иметь std :: map (int .NET 4.0). Мы, конечно, знаем, что карта является деревом и требует оператора <, который строка для нас не определяет.Использование std :: string в качестве ключа для std :: map
Ошибка 24 Ошибка C2676: бинарный '<': 'Const станд :: строка' не определяет этот оператор или преобразование к типу приемлемого для предопределенного оператора C: \ Program Files \ Microsoft Visual Studio 10.0 \ VC \ включить \ 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, но где это весело?
EDIT
Я попытаюсь объяснить это, насколько я могу для Давида. Когда на карте используется структура сравнения, она выходит из строя в выпуске и не выполняет отладочное утверждение при отладке. Утверждают, что не удается в xtree линии 1746.
Выражение: недопустимый оператор <
| Прервать | | Повторить | | Игнорировать |
Это то, что заставляет меня поверить, что, несмотря на то, что карта сопоставлена, по-прежнему по определенным путям по умолчанию используется оператор < для сравнения. Строка в моем коде, который вызывает это:
CustomObject o = stringObjectMap[key];
std :: string имеет подходящее определение требуемого оператора. Вы уверены, что включили заголовок? Я думаю, что я видел подобные проблемы, когда я не смог его включить; forward объявляет std :: string означает, что его имя известно. –
Keith
.NET не имеет ничего общего с std :: map или std :: string –
Что заставляет вас думать, что внутри слоев библиотеки по умолчанию используется '<'? Если бы это было так, это было бы сломано, и вы должны подать отчет об ошибке, но, скорее всего, вы неверно истолковываете данные - эта ошибка срабатывает во многих других ситуациях, кто-то, вероятно, обнаружил бы ее раньше ...Когда я сказал своему первому боссу, что компилятор ошибся, он улыбнулся и сказал: * В 99% случаев проблема находится между стулом и клавиатурой, а не в компиляторе. * –