Обновление проверки STL Map для входа с использованием find - PullRequest
1 голос
/ 03 ноября 2010

Я слежу за программой

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

Я получаю следующую ошибку при компиляции, которая связана с == проверить условие.

нет соответствия для оператора =='in' iter == ((CRTSLogManagerReal *) this) -> CRTSLogManagerReal :: m_mapFileNameToLogStorage.std :: map, std :: allocator>, CRTSLogManager *, std :: less, std :: allocator>>, std :: allocator, std :: allocator>, CRTSLogManager *>> ::. std :: _ Tree <_Traits> :: заканчивается _Traits = std :: _ Tmap_traits, std :: allocator>, CRTSLogManager *, std :: less, std :: allocator>>, std :: allocator, std :: allocator>, CRTSLogManager *>>, false> '

Ответы [ 4 ]

5 голосов
/ 03 ноября 2010

Вы объявляете итератор для

std::map <string, void *>

, но вы пытаетесь сравнить с итератором для

std::map< std::string, CRTSLogManager*>

Они не совместимы.

4 голосов
/ 03 ноября 2010

Разве это не должно быть объявлено как

FileNameToStorageClass::iterator iter;

?

2 голосов
/ 03 ноября 2010

std::map<std::string, CRTSLogManager*> и map<string, void*> являются разными типами и не имеют одинаковый тип итератора, поэтому вы не можете сравнить два экземпляра этих итераторов. Если вы собираетесь использовать typedefs, вы должны использовать их последовательно:

FileNameToStorageClass::iterator iter;
0 голосов
/ 03 ноября 2010

Возможно, вам не хватает аргументов типа имени для шаблонного класса, такого как std :: map?

Какой класс или тип данных для вашей пары ключ / значение? Похоже, вы хотите std :: string для вашего ключа и указатель на объект CRTSLogManager в качестве значения.

В этом случае ваш псевдоним typedef FileNameToStorageClass, вероятно, должен быть:

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

Однако код, который вы разместили, вообще не работает. Например, эта строка:

string strFilename = "MyFile"

не будет работать, если вы не определили свой собственный класс "string" или не загрузили пространство имен std. Я предполагаю, что вы используете std :: string.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...