0

我正在使用谷歌稀疏哈希图库。我有以下类模板:

template <class Key, class T,
          class HashFcn = std::tr1::hash<Key>,   
          class EqualKey = std::equal_to<Key>,
          class Alloc = libc_allocator_with_realloc<std::pair<const Key, T> > >
class dense_hash_map {
.....
typedef dense_hashtable<std::pair<const Key, T>, Key, HashFcn, SelectKey,
                        SetKey, EqualKey, Alloc> ht;
.....

};

现在我将自己的类定义为:

class my_hashmap_key_class {

private:
    unsigned char *pData;
    int data_length;

public:
    // Constructors,Destructor,Getters & Setters

    //equal comparison operator for this class
    bool operator()(const hashmap_key_class &rObj1, const hashmap_key_class &rObj2) const;

    //hashing operator for this class
    size_t operator()(const hashmap_key_class &rObj) const;

};

现在我想在 main 函数中将其作为参数传递为my_hashmap_key_classa Key, my_hashmap_key_class::operator()(const hashmap_key_class &rObj1, const hashmap_key_class &rObj2)asEqualKeymy_hashmap_key_class::operator()(const hashmap_key_class &rObj)as类作为参数:HashFcndense_hash_map

主.cpp:

dense_hash_map<hashmap_key_class, int, ???????,???????> hmap;

将类成员函数作为模板参数传递的正确方法是什么?

我试着像这样传递:

dense_hash_map<hashmap_key_class, int, hashmap_key_class::operator(const hashmap_key_class &rObj1, const hashmap_key_class &rObj2),hashmap_key_class::operator()(const hashmap_key_class &rObj)> hmap;

但是由于未检测到运算符,因此出现编译错误。请帮助我意识到我在哪里做错了。

4

1 回答 1

0

正如评论中所讨论的,您应该将等式写为operator==. 此外,要么将这些运算符设为静态,要么删除它们的一个参数(“this”指针将是相等测试的左侧操作数),否则它们将无法按预期工作。

//equal comparison operator for this class
bool operator==(const hashmap_key_class &rObj2) const;

//hashing operator for this class
size_t operator()() const;

然后,您的类就可以使用如下客户端代码了:

my_hashmap_key_class a = ...;
my_hashmap_key_class b = ...;

a == b;   // calls a.operator==(b), i.e. compares a and b for equality
a();      // calls a.operator()(), i.e. computes the hash of a

然后,您应该可以使用默认模板参数。

于 2013-10-27T20:53:30.427 回答