我正在尝试清除字典并做到这一点:
Dict d;
d.set("Home",34);
d["Home"] =56;
但是我不断出错(我无法理解左值和右值的东西)。 但由于出现左值问题,我不断收到无法执行“ d [” House“] = 56”行的错误。我也尝试覆盖运算符'=',但对我来说不起作用。
这是我的班级头文件:
#include <iostream>
#include <vector>
using namespace std;
template <class K, class V>
class Dict {
protected:
vector<K> keys;
vector<V> values;
K Key;
V Value;
public:
Dict();
Dict(K Key, V Value);
void set(K Key, V Value);
void print();
V operator[](K* str);
const V& operator[](K &str);
Dict<K,V>& operator==(const Dict<K,V> dict);
};
template class Dict<string, int>;
这是我的cpp文件:
#include "Dict.h"
template <class K, class V>
Dict<K,V>::Dict() {};
template <class K, class V>
Dict<K,V>::Dict(K Key, V Value) :
Key(Key), Value(Value){};
template <typename K, typename V>
void Dict<K,V>::set(K Key, V Value) {
keys.push_back(Key);
values.push_back(Value);
}
template <typename K, typename V>
void Dict<K,V>::print() {
cout << "{";
for(int i = 0; i < this->keys.size(); i++){
cout << "'" << this->keys[i] << "'" << "," << this->values[i];
if(i == this->keys.size() - 1){
cout << "}";
}
else{
cout << " ,";
}
}
}
template <typename K, typename V>
V Dict<K,V>::operator[](K* str) {
V lol;
for(int i = 0; i < this->keys.size(); i++){
if(this->keys[i] == *str){
return this->values[i];
}
}
return lol;
}
template <typename K, typename V>
<K,V>& Dict<K,V>::operator==(const Dict<K, V> dict) {
*this = dict;
return *this;
}
template <typename K, typename V>
const V& Dict<K,V>::operator[](K &str) {
V lol;
for(int i = 0; i < this->keys.size(); i++){
if(this->keys[i] == str){
return this->values[i];
}
}
return lol;
}
这是我的主要爱好:
#include "Dict.h"
int main() {
Dict<string, int> d,t;
d.set("Home",34);
d.set("c",13);
d.set("House",8);
string str = "HOuse";
string *str2 = &str;
int i = d[str2];
d[str2] == 56;
d.print();
return 0;
}
答案 0 :(得分:5)
代替此
V operator[](K* str);
您应该拥有
V& operator[](K* str);
const V& operator[](K* str) const;
您的运算符正在按值返回,因此他返回的是一个临时副本,因此将对该副本进行修改
和第二个允许在类的常量对象上读取的运算符