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を含めることを忘れないでください。
私はこれに頭を悩ませてきました。何かわかりましたら教えてください。ありがとう!