map<GUID, string>
От: Аноним  
Дата: 27.09.04 06:11
Оценка:
Хочу сделать map, где ключами будет являться GUID-ы. Нашел в RSDN код, подогнал пд свой, но он не хочет компилиться


class InputDataCartridgeControlBlock
{
private:
    struct GuidLess
    {
        bool operator()(const GUID& l, const GUID& r) const
        {
            return l < r;  // Тут ошибка: error C2784: 'bool std::operator <(const std::list<_Ty,_Alloc> &,const std::list<_Ty,_Alloc> &)' : could not deduce template argument for 'const std::list<_Ty,_Ax> &' from 'const GUID'

        }
    };

    struct GuidHashCompare : std::hash_compare<GUID, InputDataCartridgeControlBlock::GuidLess>
    {
        typedef std::hash_compare<GUID, InputDataCartridgeControlBlock::GuidLess> Base;
        GuidHashCompare() { }
        GuidHashCompare(const InputDataCartridgeControlBlock::GuidLess& traits) : Base(traits) { }
        
        size_t operator()(const GUID& guid) const
        {
            return guid.Data1;
        }
    };


    map<GUID, string, InputDataCartridgeControlBlock::GuidHashCompare> _IDCITable;
Re: map<GUID, string>
От: MaximE Великобритания  
Дата: 27.09.04 06:19
Оценка:
> Хочу сделать map, где ключами будет являться GUID-ы. Нашел в RSDN код, подогнал пд свой, но он не хочет компилиться

std::map<GUID, std::string> m;


Этого должно быть достаточно, при условии, что для GUID определен operator<.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
Re[2]: map<GUID, string>
От: Аноним  
Дата: 27.09.04 06:32
Оценка:
Здравствуйте, MaximE, Вы писали:

>> Хочу сделать map, где ключами будет являться GUID-ы. Нашел в RSDN код, подогнал пд свой, но он не хочет компилиться


ME>
ME>std::map<GUID, std::string> m;
ME>


ME>Этого должно быть достаточно, при условии, что для GUID определен operator<.


ME>--

ME>Maxim Yegorushkin

В общем исправил структуру GuidLess на

    struct GuidLess
    {
        bool operator()(const GUID& l, const GUID& r) const
        {
            return memcmp(&l, &r, sizeof(GUID)) < 0;
        }
    };


Но вылезает следующее: c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(484) : error C2064: term does not evaluate to a function taking 2 arguments
Re[3]: map<GUID, string>
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 27.09.04 06:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, MaximE, Вы писали:


А>В общем исправил структуру GuidLess на


А>
А>    struct GuidLess
А>    {
А>        bool operator()(const GUID& l, const GUID& r) const
А>        {
А>            return memcmp(&l, &r, sizeof(GUID)) < 0;
А>        }
А>    };
А>


А>Но вылезает следующее: c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(484) : error C2064: term does not evaluate to a function taking 2 arguments


Используй StringFromGUID2 чтобы сконвертить GUID в строку, а затем lstrcmp, lexicographical_compare, ...
"Что не завершено, не сделано вовсе" Гаусс
Re[4]: map<GUID, string>
От: Аноним  
Дата: 27.09.04 06:59
Оценка:
Здравствуйте, sadomovalex, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, MaximE, Вы писали:


А>>В общем исправил структуру GuidLess на


А>>
А>>    struct GuidLess
А>>    {
А>>        bool operator()(const GUID& l, const GUID& r) const
А>>        {
А>>            return memcmp(&l, &r, sizeof(GUID)) < 0;
А>>        }
А>>    };
А>>


А>>Но вылезает следующее: c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(484) : error C2064: term does not evaluate to a function taking 2 arguments


S>Используй StringFromGUID2 чтобы сконвертить GUID в строку, а затем lstrcmp, lexicographical_compare, ...

И что это изменит? Код все равно не компилится
Re[5]: map<GUID, string>
От: a1ex_k Россия  
Дата: 27.09.04 07:10
Оценка:
Здравствуйте, Аноним, Вы писали:

для работы с STL предикаты нужно наследовать от binary_function
А>>>
А>>>    struct GuidLess
: public std::binary_function<GUID,GUID,bool>
А>>>    {
А>>>        bool operator()(const GUID& l, const GUID& r) const
А>>>        {
А>>>            return memcmp(&l, &r, sizeof(GUID)) < 0;
А>>>        }
А>>>    };
А>>>
Re[5]: map<GUID, string>
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 27.09.04 07:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, sadomovalex, Вы писали:


S>>Здравствуйте, Аноним, Вы писали:


А>>>Здравствуйте, MaximE, Вы писали:


А>>>В общем исправил структуру GuidLess на


А>>>
А>>>    struct GuidLess
А>>>    {
А>>>        bool operator()(const GUID& l, const GUID& r) const
А>>>        {
А>>>            return memcmp(&l, &r, sizeof(GUID)) < 0;
А>>>        }
А>>>    };
А>>>


А>>>Но вылезает следующее: c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(484) : error C2064: term does not evaluate to a function taking 2 arguments


S>>Используй StringFromGUID2 чтобы сконвертить GUID в строку, а затем lstrcmp, lexicographical_compare, ...

А>И что это изменит? Код все равно не компилится

Почему? Все нормально компилится:

#include <objbase.h>
#include <map>
#include <algorithm>
#include <hash_map>

using namespace std;

class InputDataCartridgeControlBlock
{
private:
    struct GuidLess
    {
        bool operator()(const GUID& l, const GUID& r) const
        {
            TCHAR s1[64], s2[64];
            StringFromGUID2(l, (LPOLESTR)&s1[0], sizeof(s1)/sizeof(s1[0]));
            StringFromGUID2(r, (LPOLESTR)&s2[0], sizeof(s2)/sizeof(s1[0]));
            return lstrcmp(s1, s2);
        }
    };
    struct GuidHashCompare : std::hash_compare<GUID, InputDataCartridgeControlBlock::GuidLess>
    {
        typedef std::hash_compare<GUID, InputDataCartridgeControlBlock::GuidLess> Base;
        GuidHashCompare() { }
        GuidHashCompare(const InputDataCartridgeControlBlock::GuidLess& traits) : Base(traits) { }
        
        size_t operator()(const GUID& guid) const
        {
            return guid.Data1;
        }
    };
    map<GUID, string, InputDataCartridgeControlBlock::GuidHashCompare> _IDCITable;
};
"Что не завершено, не сделано вовсе" Гаусс
Re[6]: map<GUID, string>
От: MaximE Великобритания  
Дата: 27.09.04 08:21
Оценка: +1
a1ex_k wrote:

> для работы с STL предикаты нужно наследовать от binary_function


Совсем не обязательно.

Это необходимо лишь для того, чтобы сделать функторы адаптируемыми, т.е. говоря человеческим языком, чтобы функторы определяли result_type и argument_type. argument_type нужен только для std::binder1st/2nd, std::unary/binary_negate и для расширения std::compose. Учитывая, что boost::bind обеспечивает функциональность упомянутых вещей (они также обещали добавить ! для bind), в современном коде необходимость в unary/binary_function отсутствует, лишь иногда нужно, чтобы функторы определяли result_type.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
Re[4]: map<GUID, string>
От: MaximE Великобритания  
Дата: 27.09.04 08:22
Оценка: +1
sadomovalex wrote:

> Используй StringFromGUID2 чтобы сконвертить GUID в строку, а затем lstrcmp, lexicographical_compare, ...


Не уверен, что здесь необходимо это не бесплатное дополнительное преобразование.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
Re[7]: map<GUID, string>
От: a1ex_k Россия  
Дата: 27.09.04 09:16
Оценка:
Здравствуйте, MaximE, Вы писали:

>> для работы с STL предикаты нужно наследовать от binary_function

ME>Совсем не обязательно.
Ты прав!!! При использовании map нет необходимости делать предикат адаптируемым.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.