使用find重新生成STL Map检查条目

时间:2010-11-03 15:21:40

标签: c++ stl

我正在关注程序

typedef std::map<std::string, CRTSLogManager*> FileNameToStorageClass;
FileNameToStorageClass  m_mapFileNameToLogStorage;
map<string, void*>::iterator iter;
iter =m_mapFileNameToLogStorage.find(cFileName);

if(iter == m_mapFileNameToLogStorage.end())
{
   typedef std::pair<std::string, CRTSLogManager*> FileNameToStorageClassPair;
   string strFilename = "MyFile";
   CRTSLogManager *pLogManager = new CRTSLogManager();
   m_mapFileNameToLogStorage.insert(
      FileNameToStorageClassPair(strFilename, pLogManager));
}

我在编译时遇到以下错误,这与==签入条件有关。

  

'iter ==中的'operator =='不匹配   ((CRTSLogManagerReal *)此) - &GT; CRTSLogManagerReal :: m_mapFileNameToLogStorage.std ::地图,   std :: allocator&gt;,   CRTSLogManager *   性病::少,   std :: allocator&gt; &gt;中   的std ::分配器,   std :: allocator&gt;,   CRTSLogManager * GT; &GT; ::的std :: _树&LT; _Traits&GT; ::端   与_Traits =   的std :: _ Tmap_traits,   std :: allocator&gt;,   CRTSLogManager *   性病::少,   std :: allocator&gt; &gt;中   的std ::分配器,   std :: allocator&gt;,   CRTSLogManager * GT; &gt;,false&gt;'

4 个答案:

答案 0 :(得分:5)

您正在声明

的迭代器
std::map <string, void *>

但您正在尝试与

的迭代器进行比较
std::map< std::string, CRTSLogManager*>

它们不兼容。

答案 1 :(得分:4)

不应该宣布为

FileNameToStorageClass::iterator iter;

答案 2 :(得分:2)

std::map<std::string, CRTSLogManager*>map<string, void*>是不同的类型,并且没有相同的迭代器类型,因此您无法比较这些迭代器的两个实例。如果您要使用typedef,则应始终如一地使用它们:

FileNameToStorageClass::iterator iter;

答案 3 :(得分:0)

也许你错过了模板化类的类型名参数,如std :: map?

您的键/值对的类或数据类型是什么? 好像你想要键的std :: string和CRTSLogManager对象的指针作为值。

在这种情况下,你的typedef别名FileNameToStorageClass应该是:

typedef std::map<std::string, CRTSLogManager*> FileNameToStorageClass;

但是,您发布的代码似乎根本不是一个有效的程序。 例如,这一行:

string strFilename = "MyFile"
除非您定义了自己的类“string”或加载了std名称空间,否则

将无效。我假设您正在使用std :: string。