c++ - '__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);
解决方案
这里有两个问题。一、带有签名的函数
const vector<MenuItem*>* menuItems() const;
(虚拟与否)返回一个指向const
向量的限定实例的指针。-qualfied 向量的begin()
andend()
成员函数返回s,而不是s。由于您无法将 a 转换为 a 是有道理的,因此这是一个问题。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++)
{ /* ... */ }
推荐阅读
- c# - 列表框导出到图片
- python - 对象数据类型python中的矩阵
- sql - SQL Server 2012:DateDiff 在 where 子句中不包括周末
- debugging - Volttron 消息调试器没有路由到主机?
- c++ - TLS 握手成功后,服务器关闭并显示错误 SSL 例程:SSL3_GET_RECORD:wrong version number
- 4d-database - 如何在动态 4D 形式的表单对象变量的“事件”属性内链接字符串数组中的事件后,在代码中捕获事件?
- javascript - Facebook Javascript API fan_count
- c# - LINQ 加入多个表 - 即使为空也返回所有匹配项
- php - 如何编写具有两个入口点的简单 .htaccess
- c++ - 我在制作返回少数模板化参数 cpp 之一的函数时遇到问题