我想创建一个可以将CLSID结构与其他东西相关联的容器(例如,字符串);例如,std :: map。
(CLSID表示标准的Windows CLSID结构)
但是当我想使用它的find()和insert(object [clsid] = string)时,STL只是失败了并且给出了错误。
有谁知道如何解决这个问题?
例如:
typedef std::map<CLSID, std::string> MyCLSIDMap;
MyCLSIDMap mymap;
CLSID sample = CLSID_NULL;
mymap[sample] = string("test"); // compilation failed here
答案 0 :(得分:5)
正如Alex回答的那样,std :: map需要将其键与op&lt;。
进行比较bool operator<(CLSID const& l, CLSID const& r)
{
return memcmp(&l, &r, sizeof(CLSID)) < 0;
}
答案 1 :(得分:2)
您的CLSID结构是否支持可用的运算符&lt;()?这对于std :: map来说至关重要(你可以将它构建为一个单独的bool函子,它带有两个const CLSID&amp;参数,它不一定是CLSID中的方法运算符&lt;() - 但是你必须说std ::地图而不仅仅是地图......!)。
答案 2 :(得分:0)
要使用键是结构的STL映射,您需要提供自己的严格弱排序函数对象:
struct CompareCLSID
{
bool operator()(const CLSID &s1, const CLSID &s2) const
{
// returns true if s1 is less than s2
}
};
然后你的地图的类型就是map&lt; CLSID,string,CompareCLSID&gt ;.
但是,如果您不需要对容器进行排序(这是我的猜测),那么您应该使用hash&lt;&gt;或hash_map&lt;&gt;。在这种情况下,您必须提供自己的哈希函数。