问题描述
我正在处理一个必须遍历对象向量的文件,但由于某种原因,我收到此错误:
No viable conversion from '__wrap_iter<std::__1::vector<MenuItem *>::const_pointer>' to '__wrap_iter<std::__1::vector<MenuItem>::pointer>'
这是导致错误的行:
for (vector<MenuItem>::iterator p = m->menuItems()->begin() ; p != m->menuItems()->end(); p++) {
我试图遍历的类函数:
virtual const vector<MenuItem*>* menuItems() const = 0;
** 派生类的虚函数是:
virtual const vector<MenuItem*>* menuItems() const { return nullptr; }
virtual const vector<MenuItem*>* menuItems() const { return &m_menuItems; }
编辑:
在用迭代器找到我想找的东西后,我想用新找到的项目调用这个函数(递归调用)。但是,当我尝试这样做时,我没有匹配函数调用。 函数调用是:
void listAll(const MenuItem* m)
我的方式
for (vector<MenuItem*>::const_iterator p = m->menuItems()->begin() ; p != m->menuItems()->end(); p++) {
cout << (*p)->name();
if ((*p)->menuItems() == nullptr) {
cout << endl;
}
if ((*p)->menuItems() != nullptr) {
cout << endl;
vector<MenuItem*>::const_iterator k = (*p)->menuItems()->begin();
MenuItem* mPtr = *k;
listAll(mPtr);
解决方法
这里有两个问题。首先,一个带有签名的函数
const vector<MenuItem*>* menuItems() const;
(虚拟与否)返回一个指向 const
限定的向量实例的指针。 begin()
限定向量的 end()
和 const
成员函数返回 const_iterator
,而不是 iterator
。由于您无法将 const_iterator
转换为 iterator
,这是一个问题。
其次,您在迭代器的类型中缺少星号。所以正确的类型说明符应该是
vector<MenuItem*>::const_iterator p = m->menuItems()->begin(); ...
// ^ ^^^^^^
对迭代器类型使用 auto
类型推导是一种常见模式,因此您也可以这样做
for (auto p = m->menuItems()->begin() ; p != m->menuItems()->end(); p++)
{ /* ... */ }