繁体   English   中英

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

[英]dereferencing iterator causes 'can not convert' error when it seems it shouldn't

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

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

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

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

我得到的错误是这样的:

错误C2440:'return':无法从'const std :: pair <_Ty1,_Ty2> *'转换为'const std :: pair <_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_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。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM