2011-02-08 3 views
23

Я хотел бы иметь 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]; 
+7

std :: string имеет подходящее определение требуемого оператора. Вы уверены, что включили заголовок ? Я думаю, что я видел подобные проблемы, когда я не смог его включить; forward объявляет std :: string означает, что его имя известно. – Keith

+3

.NET не имеет ничего общего с std :: map или std :: string –

+3

Что заставляет вас думать, что внутри слоев библиотеки по умолчанию используется '<'? Если бы это было так, это было бы сломано, и вы должны подать отчет об ошибке, но, скорее всего, вы неверно истолковываете данные - эта ошибка срабатывает во многих других ситуациях, кто-то, вероятно, обнаружил бы ее раньше ...Когда я сказал своему первому боссу, что компилятор ошибся, он улыбнулся и сказал: * В 99% случаев проблема находится между стулом и клавиатурой, а не в компиляторе. * –

ответ

67

Ошибка 24 Ошибка C2676: бинарный «<»: «Const станд :: строка» не определяет этот оператор или преобразование к типу, приемлемое для предопределенный оператор C: \ Program Files \ Microsoft Visual Studio 10.0 \ VC \ Include \ xfunctional 125 1 FXCMMarketDataServer

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

+1

Это только что со мной, провел час, играя с картами и продолжать эту ошибку снова и снова. Я подумал: «Почему каждый пример в Интернете терпит неудачу!». Оказывается, я забыл прокрутить строку заголовка. Теперь я чувствую себя глупо. – Joseph

Смежные вопросы