0

私は抽象化するラッパークラスを作成しstd::map std::vectorboost::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[]()

私はブーストするのが比較的新しいので、どこが間違っているのか理解できません。どんな助けでもいただければ幸いです。

4

1 に答える 1

2

一見すると、あなたは、だけを持っておりconst operator[]()、これは非定数を呼び出しますgetValueAtKey()。非constを追加するか、constを追加してみてoperator[]()くださいgetValueAtKey()

于 2012-12-03T10:25:09.010 に答える