2009-04-30 3 views
1

Я хочу создать контейнер, который может связывать структуру CLSID с чем-то другим (например, строкой); например, std :: map.как сделать карту <CLSID, string>?

(CLSID означает стандартную структуру Windows, CLSID)

Однако, когда я хочу использовать его находку() и вставьте (объект [CLSID] = строка), то STL просто неудачную и дает ошибку.

Кто-нибудь знает, как это решить?

Например:

typedef std::map<CLSID, std::string> MyCLSIDMap; 
MyCLSIDMap mymap; 
CLSID sample = CLSID_NULL; 

mymap[sample] = string("test"); // compilation failed here 
+0

Вам необходимо предоставить дополнительную информацию. Попробуйте вставить в некоторый код (особенно код, где вы объявите карту) и, возможно, сообщения об ошибках. Тогда, возможно, мы сможем помочь. –

+0

Вам необходимо предоставить дополнительную информацию. Какие ошибки вы получаете? –

+0

Давай, ребята, по крайней мере, попытайтесь скомпилировать его сами :). –

ответ

2

ли поддерживает полезный оператор < (ваша структура CLSID)? Это важно для std :: map (вы можете создать его как отдельный функтор bool с двумя аргументами const CLSID &, он не должен быть оператором метода <() в CLSID - но тогда вам нужно будет сказать std :: map, а не только карта ...!).

5

Как ответил Алекс, std :: map необходимо сравнить с клавишами с op <.

bool operator<(CLSID const& l, CLSID const& r) 
{ 
    return memcmp(&l, &r, sizeof(CLSID)) < 0; 
} 
+0

точно, что мне нужно! спасибо – 2009-04-30 02:14:03

0

Чтобы использовать карту STL, где ключи структуры, вы должны будете предоставить собственную строгую слабую функцию упорядочения объекта:

struct CompareCLSID 
{ 
    bool operator()(const CLSID &s1, const CLSID &s2) const 
    { 
    // returns true if s1 is less than s2 
    } 
}; 

, а затем тип вашей собственной карты будет карта < CLSID, строка, CompareCLSID>.

Однако, если вам не нужен ваш контейнер, сортировка (это моя догадка), вы должны использовать хеш <> или hash_map <>. В этом случае вам нужно будет предоставить свою собственную функцию хэш-функции.

+0

Просто определение оператора <достаточно в этом случае. Определение простой функции (bool CompareCLSID (...) {} - это то же самое, если у вас нет состояния), или функциональный объект полезен, если вам нужно отключить поведение. –

+0

Я не думаю, что вы можете передать простую функцию для отображения. Можете ли вы привести пример? Определяющий оператор <() будет работать, но я бы рекомендовал не определять его в открытом интерфейсе, если он является ad-hoc для карты, и при сравнении этих объектов не так много смысла. – thesamet

+0

Это будет выглядеть немым в комментарии: « typedef std :: map map_t; map_t map (& cmpCLSID);" –

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