Re: Template function to display container
On Feb 13, 10:06 am, Alex Vinokur <ale...@users.sourceforge.net>
wrote:
On Feb 13, 10:01 am, Kira Yamato <kira...@earthlink.net> wrote:
On 2008-02-13 02:42:07 -0500, pelio <pe...@liticom.ar> said:
Kira Yamato dixit:
On 2008-02-13 00:41:03 -0500, Alex Vinokur
<ale...@users.sourceforge.net> said:
I would like to define template function to display any container.
Something like (but syntax below is illegal because of S<T>):
template<typename S, typename T>
void display (std::ostream& o_stream, const S<T>& i_data, const
std::string& i_delim = " ")
{
o_stream << std::flush;
std::copy (i_data.begin(), i_data.end(),
std::ostream_iterator<T> (o_stream, i_delim));
o_stream << std::endl << std::flush;
}
try
template<template<class T> S, typename T>
template<template<typename T> class S, typename T>
Right. I was too careless.
void display(std::ostream &, const S<T> &, const std::string &)
...
[...]
template<template<typename X> class V, typename S>
void display2 (std::ostream& o_stream, const V<S>& i_data, const
std::string& i_delim = " ")
{
o_stream << std::flush;
std::copy (i_data.begin(), i_data.end(),
std::ostream_iterator<S> (o_stream, i_delim.c_str()));
o_stream << std::endl << std::flush;
}
But
std::vector<std::string> v;
display2(std::cout, v)
produces
error C2784: 'void adj::display2(std::ostream &,const V<S> &,const
std::string &)' : could not deduce template argument for 'const V<S>
&' from 'std::vector<_Ty>'
with
[
_Ty=std::string
]
while compiling with Microsoft Visual C++ 2005.
There are two problems with the proposed solution: the first is
that I'm pretty sure that something like C<V> is a
non-deduceable context---the compiler won't even try to figure
out what the actual type is. The second, of course, is that
std::vector et all won't match the template template parameter,
because they have more than one parameters (the allocator, and
in the case of std::basic_string, the traits as well); the fact
that all but the first parameter has a default doesn't change
the "type" of the template.
The STL was designed expressedly so that this sort of thing
isn't necessary. That's why containers are required to have a
typedef value_type, for example. Just use it.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34