0

実行時に「ベクトル反復子は逆参照できません」というエラーを作成するこのデストラクタがあります。

gridMatrix は std::vector<std::vector<std::vector<AtomsCell< Atom<T> * > * > * > * > です。

typename と typedef も追加しましたが、まだエラーがあります。

私は、vect* of vect* の vect* の vect というこの考えに移り、boost::multi_array を使用すると思いますが、それでもこれが間違っているかどうかを理解したいと思います。

/// @brief destructor
~AtomsGrid(void) {
  // free all the memory for all the pointers inside gridMatrix (all except the  Atom<T>* )
  //typedef typename ::value_type value_type;

  typedef std::vector<AtomsCell< Atom<T>* >*> std_vectorOfAtomsCell;
  typedef std::vector<std_vectorOfAtomsCell*> std_vectorOfVectorOfAtomsCell;

  std_vectorOfAtomsCell* vectorOfAtomsCell;
  std_vectorOfVectorOfAtomsCell* vectorOfVecOfAtomsCell;
  typename std_vectorOfVectorOfAtomsCell::iterator itSecond;
  typename std_vectorOfVectorOfAtomsCell::reverse_iterator reverseItSecond;
  typename std::vector<std_vectorOfVectorOfAtomsCell*>::iterator itFirst;


  //typename std::vector<AtomsCell< Atom<T>* >*>* vectorOfAtomsCell;
  //typename std::vector<std::vector<AtomsCell< Atom<T>* >*>*>* vectorOfVecOfAtomsCell;
  //typename std::vector<std::vector<AtomsCell< Atom<T>* >*>*>::iterator itSecond;
  //typename std::vector<std::vector<AtomsCell< Atom<T>* >*>*>::reverse_iterator reverseItSecond;
  //typename std::vector<std::vector<std::vector<AtomsCell< Atom<T>* >*>*>*>::iterator itFirst;


  for (itFirst = gridMatrix.begin(); itFirst != gridMatrix.end(); ++itFirst) {
    vectorOfVecOfAtomsCell = (*itFirst);
    while (!vectorOfVecOfAtomsCell->empty()) {
      reverseItSecond = vectorOfVecOfAtomsCell->rbegin();
      itSecond = vectorOfVecOfAtomsCell->rbegin().base();

      vectorOfAtomsCell = (*itSecond); // ERROR during run: "vector iterator not dereferencable"
      // I think the ERROR is because I need some typedef typename or template ???!!!
      // the error seems here event at itFirst

      //fr_Myit_Utils::vectorElementDeleter(*vectorOfAtomsCell);
      //vectorOfVecOfAtomsCell->pop_back();
    }
  }
  fr_Myit_Utils::vectorElementDeleter(gridMatrix);
}

エラーを作成する完全なコードが必要な場合は、喜んで提供しますが、フォーラムにファイルを添付することはできないと思います。しかし、それでもそれほど大きくはないので、必要に応じてここにコピーできます。

ありがとう

4

1 に答える 1

3

の場合vは真ですstd::vectorv.rbegin().base() == v.end()あなたのコードでは、itSecondは実際にはに等しくvectorOfVecOfAtomsCell.end()、これはベクトルの終わりを超えており、参照解除できません。詳細については、MSDNページをreverse_iterator::base参照してください。

解決策について:あなたが投稿したコードでは、なぜあなたが必要なのかまったくわかりませんitSecondvectorOfAtomsCell = *reverseItSecondエラーなしで、期待する結果が得られるはずです。最後の要素へのイテレータが本当に必要な場合は、itSecond = vectorOfVecOfAtomsCell->end()-1またはを実行する必要がありますitSecond = reverseItSecond.base()-1

于 2010-05-07T10:41:16.693 に答える