Я работаю над одним из своих классов, и я столкнулся с камнем преткновения. Я дам вам образец моего источника, только имена классов, методов и имен переменных разные, но реализация такая же. Вы увидите мою проблему/s, вопрос/с & беспокойства/с в блоке кода соответствующей функции.Поиск по const std :: map
MyClass.h
#ifndef MY_CLASS_H
#define MY_CLASS_H
const std::string strOne = std::string("one");
const std::string strTwo = std::string("two");
const std::string strThree = std::string("three");
const std::string strUnknown = std::string("unknown");
enum Count {
ONE,
TWO,
THREE,
UNKNOWN
};
class MyClass {
private:
const std::map<Count, const std::string> m_mCount = createCountMap();
unsigned short m_uCount;
std::vector<std::string> m_vItems;
std::multimap<const std::string, const std::string> m_mmAssociatedItems;
public:
MyClass();
MyClass(const std::string strItem1, const std::string strItem2);
static MyClass* get();
void addItem(Count type, const std::string& strItem2);
void addItem(const std::string& strItem1, const std::string& strItem2);
private:
static const std::map<Count, const std::string> createCountMap();
};
#endif // MY_CLASS_H
MyClass.cpp
#include "stdafx.h"
#include "MyClass.h"
static MyClass* s_pMyClass = nullptr;
const std::map<Count, const std::string> MyClass:createCountMap() {
std::map<Count, const std::string> m;
m.insert(std::make_pair(Count::ONE, strOne));
m.insert(std::make_pair(Count::TWO, strTwo));
m.insert(std::make_pair(Count::Three, strThree));
m.insert(std::make_pair(Count::UNKNOWN, strUnknown));
return m;
} // createCountMap
MyClass* MyClass::get() {
if (!s_pMyClass) {
return nullptr;
}
return s_pMyClass;
} // get
MyClass::MyClass() : m_uCount(0) {
m_vItems.clear();
m_mmAssociatedItems.clear();
} // MyClass
MyClass::MyClass(const std::string& strItem1, const std::string& strItem2) :
m_uCount(0) {
addItem(strItem1, strItem2);
} // MyClass
void MyClass::addItem(Count type, const std::string& strItem2) {
const std::map<Count, const std::string>::const_iterator it = m_mCount.find(type);
if (it == m_mCount.end()) {
// Did not find a valid item key!
// Throw Exception Here!
}
m_vItems.push_back(strItem2);
m_mmAssociatedItems.insert(std::make_pair(it->second, m_vItems.at(m_uCount)));
++m_uCount;
}
void MyClass::addItem(const std::string& strItem1, const std::string& strItem2) {
// I need to do a similar thing as above instead of looking through my
// const std::map at the key values for a match, with this overloaded
// function call I need to use strItem1 as the search item to see if it
// is within the contents of this map which would be the map's ->second
// value. If not throw a similar error as above otherwise once it is
// found populate my vector and multimap same as above and increment
// my count variable.
// This would logically be my next step
const std::map<Count, const std::string>::const_iterator it = m_mCount.begin();
// It Is Within This For Loop That It Fails To Compile! It
// Fails At The it++ Part! Is There A Way Around This? Or
// Am I Missing Something Simple?
for (; it != m_mCount.end(); it++) {
// If strItem1 == it->second && it != m_mCount.end()
// found it, add items, if not throw error
}
m_vItems.push_back(strItem2);
m_mmAssociatedItems.insert(std::make_pair(strItem1, strItem2));
++m_uCount;
}
В моем источнике, именно эта вторая функция, которая является более важным, то первый! Любая помощь или предложения очень ценится.
Лучше всего не создавать параметры шаблона контейнеров const. Достаточно объявить контейнер сам const. Также необычно объявлять тип возвращаемого значения const. –