解除引用迭代器会导致“无法转换”错误,因为它似乎不应该

时间:2012-03-21 19:49:57

标签: c++ iterator const-iterator

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

我遇到的基本问题是我正在尝试为我编写的地图包装器创建自己的迭代器并重载运算符 - >()给我带来麻烦。这是给我一些问题的代码:

const pair<wstring, PropertyMap*>* ObjectMapIterator::operator->() const
{
    return &*m_MapIter;
}

我知道通常返回一个const变量并没有多大意义,但是我似乎无法弄清楚如何以一种方式执行此操作,这样可以使程序的其余部分保持正确而不会这样做

我得到的错误是:

  

错误C2440:'return':无法从'const转换   的std ::对&LT; _Ty1,_Ty2&GT; *'to'const std :: pair&lt; _Ty1,_Ty2&gt; *'

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

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_MapIter和重载运算符的返回值都是相同的......我从.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。

我一直在摸不着头脑。如果你搞清楚了,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:2)

std::map::const_iterator返回一个临时的,而不是引用,所以你试图获取该临时的地址并将其返回。

为什么不按价值返回pair

std::pair<std::wstring, PropertyMap*>* ObjectMapIterator::operator->() const
{
    return *m_MapIter;
}

实际上,如果您的运营商将返回std::map::const_iterator::pointer,则为 std::map::const_iterator::operator->()确实如此,一切都会好的:

std::map<std::wstring, PropertyMap*>::const_iterator::pointer operator->() const
{
return &*m_MapIter;
}

另外,std::map::const_iterator::operator->()返回的值是实现定义的,可能最好使用

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