1

我在 C++ 项目的源文件中声明了一个名为 hMap 的对象:

dense_hash_map<unsigned char *, int, hash<unsigned char *> > hMap;

其中哈希图的键是“无符号字符数组”类型,值是“int”类型。我需要将此对象传递给函数 hMap_receive() 并且应该能够持有对象的所有权,即 hMap_receive() 应该能够修改对象 hMap 的内容。

问题:我应该将它作为指针传递吗?我通过了检查,但无法调用两个运算符重载方法 - 数组订阅运算符和赋值运算符(如下所示),它们是类“dense_hash_map”的公共成员。

data_type& operator[](const key_type& key) {       // This is our value-add!
    // If key is in the hashtable, returns find(key)->second,
    // otherwise returns insert(value_type(key, T()).first->second.
    // Note it does not create an empty T unless the find fails.
    return rep.template find_or_insert<DefaultValue>(key).second;
  }

  dense_hashtable& operator= (const dense_hashtable& ht) {
    if (&ht == this)  return *this;        // don't copy onto ourselves
    if (!ht.settings.use_empty()) {
      assert(ht.empty());
      dense_hashtable empty_table(ht);  // empty table with ht's thresholds
      this->swap(empty_table);
      return *this;
    }

例子:

hMap_receive(dense_hash_map<int, unsigned char *, hash<int> > hMap, 
unsigned char *key,int data){
.........
.........
 hMap[key] = data;
 cout << hMap[key];
.........
}

工作正常并将数据分配给键值并打印与键关联的数据。但,

hMap_receive(dense_hash_map<int, unsigned char *, hash<int> > *hMap, 
unsigned char *key,int data){
    .........
    .........
     hMap[key] = data;
     cout << hMap[key];
    .........
    }

既不分配数据也不给出关键数据。而是给出错误:

error: invalid types ‘google::dense_hash_map<unsigned char*, int, 
std::tr1::hash<unsigned char*>, eqstr>*[unsigned char*]’ for array subscript

如果我通过指针传递对象,为什么它不能正常工作?如果这不是正确的方法,我应该如何传递对象,以便我能够对对象执行所有操作而不会出错,并且还能够修改调用函数的原始传递对象。

4

1 回答 1

1

[]指针类型有特定的含义。如果x有类型T *,则x[a]表示*(x+a),结果是类型T。因此,即使 typeT有一个重载的[]运算符,它也不会发挥作用。

因此,错误消息是关于您dense_hash_map<>没有<<为其定义运算符的事实。

你想传递对你的引用dense_hash_map<>,而不是它的地址。

hMap_receive(dense_hash_map<unsigned char *, int, hash<unsigned char *> > &hMap, 
             unsigned char *key,int data){
    //...

*如果with ,请注意替换&

这允许您通过引用调用传入数据结构的函数。这意味着该函数正在操作用于调用该函数的对象,而不是一个副本。

dense_hash_map<unsigned char *, int, hash<unsigned char *> > my_map;
//...
hMap_receive(my_map, "foo", 10);
//...my_map may be updated by the function
于 2013-10-05T21:51:09.850 回答