Я только начал с c ++, и у меня есть некоторые проблемы с созданием шаблона класса с именем auto_map , который использует std :: map , который должен хранить не объекты, а их указатели.
Что-то вроде:
std::map<K*, V*, cmp> m;
Что я использую так:
auto_map<std::string, std::string> t;
t.insert( new std::string( "A" ), new std::string( "B" ) );
cpm:
struct cmp
{
bool operator()(K *a, K *b) { return *a < *b; }
bool operator== (K *a) { return (*a); }
};
Функция вставки ищет любые дубликаты перед вставкой:
void insert(K* k, V* v)
{
for (typename std::map<K*, V*, cmp>::iterator i=m.begin(); i!=m.end(); ++i)
{
if ( (*k) == (*(*i).first) )
{
delete (*i).first;
delete (*i).second;
m.erase(i);
}
}
m.insert(std::make_pair(k,v));
}
И конструкторы:
auto_map(){}
~auto_map()
{
for (typename std::map<K*, V*, cmp>::iterator i=m.begin(); i!=m.end(); ++i)
{
delete (*i).first;
delete (*i).second;
m.erase(i);
}
}
Они работают нормально, но теперь вы, наверное, поняли идею.
Поэтому возникает вопрос, в котором я не уверен:
Как мне написать для него конструктор копирования?
auto_map (auto_map& original)
{
for (typename std::map<K*, V*, cmp>::iterator i=original.m.begin(); i!=original.m.end(); ++i)
{
// what goes in here that will call each objects copy-constructor?
// how not to get complained about invalid conversions?...
// K newk = (*(*i).first);
// V newv = (*(*i).second);
// m.insert(std::make_pair(newk, newv));
// gives compiler error: cannot convert ‘const CntInteger’ to ‘CntInteger* const’ in initialization
// cannot convert ‘const CntInteger’ to ‘CntInteger*’ in initialization
}
};
Большое спасибо за ответы и исправления!