1

VS 2008を使用する場合、ターゲット環境は、違いが生じる場合はARMプロセッサを搭載したWindowsCEです。私たちが使用しているコンパイラも古いものだと知っています...

私が抱えている基本的な問題は、自分が作成したマップラッパー用に独自のイテレーターを作成しようとしていて、演算子->()をオーバーロードすると問題が発生することです。これは私に問題を与えているコードのビットです:

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

通常、const変数を返すことは実際には意味がないことは知っていますが、それを行わずにプログラムの残りの部分をconst-correctにする方法でこれを行う方法を理解できないようです。

私が得るエラーはこれです:

エラー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を含めることを忘れないでください。

私はこれに頭を悩ませてきました。何かわかりましたら教えてください。ありがとう!

4

1 に答える 1

3

std::map::const_iterator参照ではなく一時を返すため、その一時のアドレスを取得して返そうとしています。

単純pairに値で返さないのはなぜですか?

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

実際、オペレーターが を返す場合std::map::const_iterator::pointerstd::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->());
}
于 2012-03-21T20:15:12.217 に答える