我正在编写一个抽象std::map
std::vector
和boost::unordered_map
的包装类,为此,我定义了封装每个容器的单独容器类和一个抽象基类。这些课程很常见。另一个名为MyWrapper
的类重载[]
运算符,并调用抽象基类的指针上的方法来获取值。它还从boost::any_range
创建一个自定义迭代器来迭代值。这是我的包装和基类:
class MyClass{
ContainerBase* cb;
//my custom iterator
typedef boost::any_range<valT,boost::bidirectional_traversal_tag,
valT&,std::ptrdiff_t>::iterator iterator;
// other methods and costructor
const valT& operator[](size_t idx) const{
return cb->getValueAtkey[idx];
}
iterator begin(){
return cb->getbegin();
}
}
class ContainerBase{
//other methods
virtual valT& getValueAtKey(size_t); //calls the underlying container's subscript
virtual MyClass::iterator getbegin();
}
我正在使用模板化的map类并使用boost::transform_iterator
在其上定义自定义迭代器来迭代键值,如下所示:
template<class MapType> //std::map or boost::unordered_map
class MapDerived : public ContainerBase{
MapType cont;
typedef boost::transform_iterator<value_extractor,typename MapType::iterator> value_iterator;
MyClass::iterator getbegin(){
return MyClasss::iterator(
boost::make_transform_iterator<value_extractor,typename MapType::iterator>(cont.begin(),value_extractor()
);
} //similar function for end iterators
}
我在编译时遇到以下错误:
..boost/range/detail/any_iterator_wrapper.hpp:356:
error: invalid initialization of non-const reference of type 'valT&' from a temporary of type 'int'
在instantiated from here
return cb->getValueAtkey[idx];
处发出MyClass::operator[]()
条消息
我相对较新,因此无法弄清楚我哪里出错了。任何帮助将不胜感激。
答案 0 :(得分:2)
乍一看,您只有一个const operator[]()
,这会调用非常量getValueAtKey()
。尝试添加非const operator[]()
或添加const getValueAtKey()
。