我编写了一个包装类来对类型向量执行插入/删除操作。 代码:
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&gt;}'转换为'Atom *'
答案 0 :(得分:6)
Atom* first = atoms.begin(); // <== type error
这将first
设置为等于迭代器。您希望将其设置为等于迭代器指向的对象。尝试:
Atom* first = *(atoms.begin());
或:
Atom* first = atoms.front();
由于这是Atom*
的向量,因此其迭代器指向Atom*
s。
答案 1 :(得分:3)
std::vector::begin
不返回向量的第一个元素,它返回一个迭代器(指向第一个元素),可用于迭代向量。
您正在寻找的方法很可能是std::vector::front()
。