私は抽象化するラッパークラスを作成し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();
}
テンプレート化されたマップクラスを使用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[]()
私はブーストするのが比較的新しいので、どこが間違っているのか理解できません。どんな助けでもいただければ幸いです。