Re: What am I missing? (template magic gone wrong)
On Wed, 27 Feb 2008 moswald@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.)
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
}
Both lines should fail. The standard defines std::vector as
template <typename E, typename Allocator = std::allocator
[, further, implementation-defined parameters with defaults]>
class vector;
and std::map as
template <typename K, typename V, typename Allocator = std::allocator
[, futher, implementation-defined parameters with defaults]>
class map;
In other words,
1) you'd need two- and three-parametered template template parameters in
ContainerDelete to correctly match what you want and
2) even then, there might be implementations where it will fail.
You cannot reliably match template template parameters against standard
containers. You'll have to find some other trick.
Sebastian Redl
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]