2

型ベクトルに対して挿入/削除操作を実行するラッパークラスを作成しました。コード:

class GenericSymbolTable {
   public:
       virtual void pushBackAtom(Atom *atom) = 0;
       virtual Atom* peekAtom(void) = 0;
       virtual Atom* getAtom(void) = 0;

   protected:
      ~GenericSymbolTable(void){}
};

class SymbolTable : public GenericSymbolTable {
   private:
       vector<Atom*> atoms;

   protected:
       ~SymbolTable(void);

   public:
       void pushBackAtom(Atom *atom);
       Atom* peekAtom(void);
       Atom* getAtom(void);
};

これらのメソッドの実装を作成するとき、コンパイラは競合するタイプエラーをスローします。

   Atom* SymbolTable::peekAtom(void) {
      if(atoms.empty()) {
          cout << "\t[W] Simbol table does not contain any atoms" << endl;
          return NULL;
      }

      Atom* first = atoms.begin(); // <== type error
      return first;
   }

   Atom* SymbolTable::getAtom(void) {
      if(atoms.empty()) {
          cout << "\t[W] Simbol table does not contain any atoms" << endl;
          return NULL;
      }

      Atom* first = atoms.begin(); // <== type error
      atoms.erase(atoms.begin());
      return first;
   }

エラーメッセージ:初期化時に「std :: vector :: iterator {aka __gnu_cxx ::__normal_iterator>}」を「Atom*」に変換できません

4

2 に答える 2

11
  Atom* first = atoms.begin(); // <== type error

これはfirstイテレータと同じに設定されます。イテレータが指すオブジェクトと同じに設定したかったのです。試す:

  Atom* first = *(atoms.begin());

また:

  Atom* first = atoms.front();

これはのベクトルであるためAtom*、そのイテレータはsを指しますAtom*

于 2012-09-29T13:18:21.590 に答える
5

std::vector::beginベクトルの最初の要素を返すのではなく、ベクトルを反復処理するために使用できるイテレータ(最初の要素を指す)を返します。

あなたが探している方法はおそらくstd::vector::front()です。

于 2012-09-29T13:18:26.887 に答える