使用模板类重载[]运算符的问题

时间:2014-11-20 13:33:11

标签: c++ templates overloading operator-keyword

我在使用c ++中的模板类重载下标运算符时遇到问题。我有一个自定义的地图类实现,我需要能够通过密钥访问元素。

template <typename K, typename DT>
DT& myMap<K, DT>::operator[](K key)
{
  for (int i = 0; i<size; i++)
 {
    if (elements[i].key == key){
        return elements[i].data;
    }
 } 
}

我现在是怎么试图让操作员超载的。编译器不接受K键来搜索数据。 K是密钥的数据类型。它存储在myMap类包含在数组中的单独类中。

因此,如果在主要方面,我会尝试:

myMap<string, int> * test = new myMap < string, int > ;
test["car"] = 50;

它说:

Error expression must have an integral or unscoped enum type

我不太确定问题是什么。

2 个答案:

答案 0 :(得分:5)

test是指向MyMap的指针,而不是其对象,因此test["car"]正在调用内置解除引用运算符,而不是您的重载。

您需要(*test)["car"]test->operator[]("car")才能使其正常运作。

答案 1 :(得分:0)

您的错误是您使用指针MyMap而不是对象本身。而不是

myMap<string, int> * test = new myMap < string, int > ;
(*test)["car"] = 50 // works but is not idiomatic C++
// ...
delete test; // don't forget!

你应该使用

auto test = myMap<string, int>{}; 
// or: myMap<string, int> test = myMap<string, int>{};
test["car"] = 50

如果你真的需要使用指针,你至少应该使用智能指针:

auto test_ptr = std::make_unique<myMap<string, int>>();
// or: std::unique_ptr<myMap<string, int>> test_ptr = std::make_unique<myMap<string, int>>();
(*test)["car"] = 50;