我看了几篇关于const限定符的帖子,但我无法弄清楚如何解决这个问题。我正在构建一个以STL map类为模型的类,我使用STL set类作为基类:
template <class Key, class Value>
class map : public std::set <std::pair<Key, Value> > {
public:
typedef std::set<std::pair<Key, Value> > parent;
typedef typename std::set<std::pair<Key, Value> >::iterator iterator;
// constructors
map() : parent() {}
map(map<Key, Value>& m) : parent(m) {}
// definition for subscript operator
Value& operator [] (const Key &);
// overloaded methods from set
void erase(Key&);
void erase(iterator& itr) {
parent::erase(itr);
}
int count(Key&);
iterator find(Key&);
iterator lower_bound(Key& k) {
return parent::lower_bound(k);
}
iterator upper_bound(Key& k) {
return parent::upper_bound(k);
}
// not found iterator
iterator end() {
return parent::end();
}
};
问题在于operator []重载功能,如下所示:
template <class Key, class Value>
Value& map<Key, Value>::operator[] (const Key& k) {
std::pair<Key, Value> test;
test.first = k;
std::pair<iterator, bool> where = parent::insert(test);
return (*(where.first)).second;
}
编译器给出了错误“... map.h:108:16:对类型'int'的引用绑定到'const int'类型的值会丢弃限定符”。我意识到它正在看到(*(where.first))。第二个被评估为“const int”并且我将它返回到“int”因为我已经将地图声明为:
map<std::string, int> mymap;
mymap["one"] = 1;
std::pair<...>
似乎被定义为std::pair<std::string, const int>
而不是std::pair<std::string, int>
。至少这是我的猜想。我必须遗漏一些简单的东西,但我没有看到它。非常感谢任何帮助。
答案 0 :(得分:3)
问题是std::set
元素是不可变的(否则你可以随意修改它们并在没有set
知道它的情况下弄乱排序);这是由返回const迭代器的方法强制执行的。
因此,*(where.first)
为const
,因此(*(where.first)).second
也是如此。因此,您无法返回非const
引用。