::const_pointer>' 到 '__wrap_iter::指针>',c++,vector,stl,iterator,constants"/>

首页 > 解决方案 > '__wrap_iter 没有可行的转换::const_pointer>' 到 '__wrap_iter::指针>'

问题描述

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

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);

标签: c++vectorstliteratorconstants

解决方案


这里有两个问题。一、带有签名的函数

const vector<MenuItem*>* menuItems() const;

(虚拟与否)返回一个指向const向量的限定实例的指针。-qualfied 向量的begin()andend()成员函数返回s,而不是s。由于您无法将 a 转换为 a 是有道理的,因此这是一个问题。constconst_iteratoriteratorconst_iteratoriterator

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

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

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

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

推荐阅读