C++ 解引用迭代器导致';无法转换';似乎不应该出错时出错';T

C++ 解引用迭代器导致';无法转换';似乎不应该出错时出错';T,c++,iterator,const-iterator,C++,Iterator,Const Iterator,使用VS 2008,目标环境是带有ARM处理器的Windows CE,如果这有区别的话。我知道我们使用的编译器也有点过时了 我遇到的基本问题是,我正在尝试为我编写的映射包装器生成自己的迭代器,而重载运算符->()会给我带来麻烦。这是一段给我带来问题的代码: const pair<wstring, PropertyMap*>* ObjectMapIterator::operator->() const { return &*m_MapIter; } 常量对*Ob

使用VS 2008,目标环境是带有ARM处理器的Windows CE,如果这有区别的话。我知道我们使用的编译器也有点过时了

我遇到的基本问题是,我正在尝试为我编写的映射包装器生成自己的迭代器,而重载运算符->()会给我带来麻烦。这是一段给我带来问题的代码:

const pair<wstring, PropertyMap*>* ObjectMapIterator::operator->() const
{
    return &*m_MapIter;
}
常量对*ObjectMapIterator::operator->()常量
{
返回&*m\u映射器;
}
我知道通常返回一个常量变量是没有意义的,但我似乎不知道如何在不这样做的情况下让程序的其余部分保持常量正确

我得到的错误是:

错误C2440:“返回”:无法从“常量”转换 std::pair*'到“const std::pair*”

此迭代器的标题如下所示:

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;
};
类ObjectMapIterator
{
公众:
ObjectMapIterator(常量ObjectMap和rObjectMap);
常量ObjectMapIterator&operator++(int-rhs);
std::pair运算符*()常量;
常量std::pair*运算符->()常量;
bool isDone()常量;
私人:
const std::map*m_ppropertymap;
std::map::const_迭代器m_映射器;
};
如您所见,m_映射器和重载运算符的返回值都是相同的。。。我从项目这一部分的.h和.cpp文件中取出了所有const语句,并用相同的错误重新编译,因此我认为这不是问题所在

如果我改为这样做,程序将编译:

const pair<wstring, PropertyMap*>* ObjectMapIterator::operator->() const
{
    const pair<wstring, PropertyMap*>* returnVal = new pair<wstring, PropertyMap*>(*m_MapIter);
    return returnVal;
}
常量对*ObjectMapIterator::operator->()常量
{
常量对*returnVal=新对(*m_MapIter);
返回值;
}
我知道这样做会导致内存泄漏,我把它放进智能指针并不是为了节省空间来发布这个

以下是完整的.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();
}
#包括“stdafx.h”
#包括“ObjectMap.h”
使用名称空间std;
ObjectMapIterator::ObjectMapIterator(常量ObjectMap和rObjectMap)
:m_pPropertyMaps(&(rObjectMap.m_PropertyMaps)),
m_映射器(m_pPropertyMaps->begin())
{}
常量ObjectMapIterator&ObjectMapIterator::operator++(int-rhs)
{
如果(m_MapIter!=m_ppropertypaps->end())
{
m_MapIter++;
归还*这个;
}
其他的
{
归还*这个;
}
}
对ObjectMapIterator::运算符*()常量
{
返回*m_映射器;
}
常量对*ObjectMapIterator::运算符->()常量
{
返回&*m\u映射器;
}
bool ObjectMapIterator::isDone()常量
{
返回m_MapIter==m_ppropertypaps->end();
}
ObjectMapIterator定义位于ObjectMap.h文件中。所以我没有忘记包括ObjectMapIterator

我已经为这个挠头太久了。如果你有什么发现,请告诉我。谢谢

std::map::const_迭代器
返回一个临时值,而不是一个引用,所以您试图获取该临时值的地址并返回它

为什么不直接按值返回
pair

std::pair<std::wstring, PropertyMap*>* ObjectMapIterator::operator->() const
{
    return *m_MapIter;
}
另外,对于
std::map::const_iterator::operator->()
返回的值,可能最好使用

auto operator->() const -> decltype(m_MapIter.operator->())
{
return (m_MapIter.operator->());
}

说得好!我知道我现在哪里出错了,但这并不能完全解决我的问题。你必须返回一个指针,使操作符->正常工作,因为C++会使用一个语句,比如“ObjPiTrime>第二个”,并将其转换成“(ObjMaTime:Talm ->))->“但是这肯定会帮助我得到一个有效的解决方案。谢谢谢谢你的提醒。你也许刚刚帮我省去了几个小时寻找信息的麻烦。迭代器有时令人困惑。
auto operator->() const -> decltype(m_MapIter.operator->())
{
return (m_MapIter.operator->());
}