我在使用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
我不太确定问题是什么。
答案 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;