没有从 '__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>'

这是导致错误的行:

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++)
    { /* ... */ }