Re: Problem with typename.
StephQ wrote:
First of all: distinction of keywords typename and class in template
arguments.
Accoarding to a post in a well known moderated group:
"There are three possibilities for template arguments:
1) type as in "template <typename T>" or "template <class T>"
2) non-type as in "template <int N>"
3) class template as in "template <template<typename> class C>" "
Now, in 1 class and typename are equivalent.
1 is parametrizing the type of the object
1 is a beginning of a template declaration. WHAT it parameterises
(a type or a function) is defined _after_ the closing angle bracket.
template<typename T> class A; // declares a class template "A"
template<typename T> void foo(int); // declares a function template
2 is parametrizing which object
Uh... I don't understand that statement.
In 3 you have to use class, because C is just a template class.
Huh?
But I admit I am a little confused here, what is exactly C?
C is a template with exactly 1 argument which is itself a type.
Could I
pass stl vector as C ?
Mmm... No. 'std::vector' has more than 1 argument.
So template<typename> really means only that C
is a class template (and not a type), but actually could be defined by
more than 1 template argument? Where could I find a concrete easy
example?
On the web?
Also, what is considered a good programming syntax?
Any syntax your compiler doesn't barf at is "good programming syntax".
Using typename in
1 and 2, while class in 3?
Doesn't matter. Either will do.
Another problem I'm facing is that gcc requires the typename keyword
in a lot of situations, like:
template <class T>
void print(const std::vector<T>& vec)
{
std::vector<T>::const_iterator i;
...
}
warning: `std::vector<T, std::allocator<_CharT> >::const_iterator' is
implicitly a typename (deprecated)
I don't know where should I add the typename keyword, and why.
To disambiguate anything as a type name. Usually it is required with
"dependent names". Look it up.
p.s. Is there a way to write a print function once for list, vector,
deque, .... ?
Yes, it's called "std::copy" or "std::transform" or "std::for_each".
std::copy(mylist.begin(), mylist.end(),
std::ostream_iterator<int>(std::cout, ", "));
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask