使用VS 2008,目标环境是带有ARM处理器的Windows CE(如果这有所帮助)。我知道我们使用的编译器是有点过时了...取消引用迭代器导致'无法转换'错误,当它看起来不应该
我遇到的基本问题是,我正在尝试使我自己的迭代器为我编写的地图包装器并重载运算符 - >( )给我带来麻烦。这是那是给我的问题的代码位:
const pair<wstring, PropertyMap*>* ObjectMapIterator::operator->() const
{
return &*m_MapIter;
}
我知道,它并没有真正意义的通常会返回一个const变量,但我似乎无法弄清楚如何做到这一点一种让程序的其余部分无需这样就可以保持正确的方法。
我得到的错误是这样的:
错误C2440: '回归':不能从 '常量 的std ::对< _Ty1,_Ty2> *' 到“常量的std ::对< _Ty1转换,_Ty2> *”
这个迭代器的标题是这样的:
class ObjectMapIterator
{
public:
ObjectMapIterator(const ObjectMap& rObjectMap);
const ObjectMapIterator& operator++(int rhs);
std::pair<std::wstring, PropertyMap*> operator*() const;
const std::pair<std::wstring, PropertyMap*>* operator->() const;
bool isDone() const;
private:
const std::map<std::wstring, PropertyMap*>* m_pPropertyMaps;
std::map<std::wstring, PropertyMap*>::const_iterator m_MapIter;
};
正如你可以看到,无论是m_MapIte r和重载操作符的返回值是相同的......我将这个部分的.h和.cpp文件中的所有const语句拿出来,并用相同的错误重新编译,所以我不认为这是一个问题。
如果我做这样的事情,而不是,该程序将编译:
const pair<wstring, PropertyMap*>* ObjectMapIterator::operator->() const
{
const pair<wstring, PropertyMap*>* returnVal = new pair<wstring, PropertyMap*>(*m_MapIter);
return returnVal;
}
我知道,这样做会导致内存泄漏,我没有把它变成一个智能指针只是为了节省空间张贴这个。
这里是在情况下,整个.cpp文件,你可能会发现,相关:
#include "stdafx.h"
#include "ObjectMap.h"
using namespace std;
ObjectMapIterator::ObjectMapIterator(const ObjectMap& rObjectMap)
:m_pPropertyMaps(&(rObjectMap.m_PropertyMaps)),
m_MapIter(m_pPropertyMaps->begin())
{}
const ObjectMapIterator& ObjectMapIterator::operator++(int rhs)
{
if(m_MapIter != m_pPropertyMaps->end())
{
m_MapIter++;
return *this;
}
else
{
return *this;
}
}
pair<wstring, PropertyMap*> ObjectMapIterator::operator*() const
{
return *m_MapIter;
}
const pair<wstring, PropertyMap*>* ObjectMapIterator::operator->() const
{
return &*m_MapIter;
}
bool ObjectMapIterator::isDone() const
{
return m_MapIter == m_pPropertyMaps->end();
}
的ObjectMapIterator定义是ObjectMap.h文件里。所以我不会忘记包含ObjectMapIterator。
我一直在挠挠我的头太久。请让我知道,如果你想出任何东西。谢谢!
好点!我明白我现在出了什么问题,但这并不能完全解决我的问题。您必须返回一个指针,以便operator->正常工作,因为C++将采用类似“objMapIter-> second”的语句并将其转换为“(objMapIter.operator - >()) - > second”。 但这绝对会帮助我找到一个有效的解决方案。谢谢! – 2012-03-21 20:19:57
@ c.hughes啊,我的失败! – Lol4t0 2012-03-21 20:29:24
@ c.hughes,请参阅我的编辑,请 – Lol4t0 2012-03-21 20:52:58