Re: What am I missing? (template magic gone wrong)
On Feb 27, 3:04 am, mosw...@gmail.com wrote:
From the following code, what am I doing wrong? (I'm using VS2008,
which is better at templates than I am, so I assume I'm missing
something.)
struct SequenceDelete
{
template<typename ptr_type>
void operator()(const ptr_type *p) const
{
delete p;
}
};
struct AssociativeDelete
{
template<typename pair_type>
void operator()(const pair_type &p) const
{
delete p.second;
}
};
template<template<typename, typename> class container_type, typename
K, typename V>
void ContainerDelete(container_type<K, V> &c)
{
std::for_each(c.begin(), c.end(), AssociativeDelete());
c.clear();
}
template<template<typename> class container_type, typename T>
void ContainerDelete(container_type<T> &c)
{
std::for_each(c.begin(), c.end(), SequenceDelete());
c.clear();
}
void Foo()
{
std::map<int, int *> my_map;
for(int i = 0; i != 10; ++i)
my_map[i] = new int();
std::vector<int *> my_vector;
for(int i = 0; i != 10; ++i)
my_vector[i] = new int();
ContainerDelete(my_vector);
ContainerDelete(my_map); // this line fails to compile -- it
treats it as the second template version
}
std::map takes four template parameters - the key type, the value
type, the comparator type, and the allocator type. At the same time,
vector takes two (value and allocator). You will need to write a
version of ContainerDelete for a template taking four parameters in
order for that to work. However, it's probably a safer idea just to
either instantiate on the complete type of the template (like
ContainerDelete< map<int, int *> >), or to not write ContainerDelete
at all and just write the for_each code directly inline.
Sean
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]