2012-03-21 21 views
0

使用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。

我一直在挠挠我的头太久。请让我知道,如果你想出任何东西。谢谢!

回答

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

好点!我明白我现在出了什么问题,但这并不能完全解决我的问题。您必须返回一个指针,以便operator->正常工作,因为C++将采用类似“objMapIter-> second”的语句并将其转换为“(objMapIter.operator - >()) - > second”。 但这绝对会帮助我找到一个有效的解决方案。谢谢! – 2012-03-21 20:19:57

+0

@ c.hughes啊,我的失败! – Lol4t0 2012-03-21 20:29:24

+0

@ c.hughes,请参阅我的编辑,请 – Lol4t0 2012-03-21 20:52:58

相关问题