没有从“__wrap_iter<std::__1::vector<MenuItem *>::const_pointer>”到“__wrap_iter<std::__1::vector<MenuItem>::pointer>”的可行转换

No viable conversion from '__wrap_iter<std::__1::vector<MenuItem *>::const_pointer>' to '__wrap_iter<std::__1::vector<MenuItem>::pointer>'

我正在处理一个文件,我必须遍历对象的向量但由于某种原因我收到此错误:

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++) {

我正在尝试迭代的 class 函数:

 virtual const vector<MenuItem*>* menuItems() const = 0;

** 派生的 classes 处的虚函数是:

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;

(虚拟与否)returns 指向向量的 const 限定实例的指针。 begin()end() 成员函数 const-限定向量 return const_iterators,而不是 iterators。由于无法将 const_iterator 转换为 iterator,这是一个问题。

其次,您在迭代器类型中缺少一个星号。所以正确的类型说明符应该是

vector<MenuItem*>::const_iterator p = m->menuItems()->begin(); ...
//             ^   ^^^^^^

对迭代器类型使用auto类型推导是一种常见的模式,因此您也可以这样做

for (auto p = m->menuItems()->begin() ; p != m->menuItems()->end(); p++)
    { /* ... */ }