Использование std :: string в качестве ключа для std :: map - PullRequest
23 голосов
/ 09 февраля 2011

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

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

Поэтому я включил свой 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 может показаться, что она игнорирует приведенное выше определение и по умолчанию использует оператор <. </p>

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

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

РЕДАКТИРОВАТЬ

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

Выражение: недопустимый оператор <</p>

| Abort || Повторить || Ignore |

Это то, что заставляет меня верить, что, несмотря на то, что сопоставление сопоставляется с картой, оно все равно идет по определенным путям по умолчанию к оператору <для сравнения.Строка в моем коде, которая вызывает это: </p>

CustomObject o = stringObjectMap[key];

1 Ответ

69 голосов
/ 09 февраля 2011

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

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

...