c++ templates without "typename" or "class"
i'm used to write templates like this:
template<typename T>
void someFunction(SomeClass<T> argument);
however - now I encountered templates in another thread written like this:
template<U>
void someFunction(SomeClass<U> argument);
as far as i know one can use "typename" and "class" interchangably (except for some details regarding nested types..). but what does it mean if i don't put a keyword in the brackets at a开发者_如何学编程ll?
thanks!
the thread in question: Problems writing a copy constructor for a smart pointer
That code is wrong (typo). There must be a typename
or class
in this situation.
- The one with
class
compiles. - The one without fails with
error: ‘U’ has not been declared
.
However, it does not mean that all template parameters must start with a typename
/class
. This is because besides types, a template parameter can also be integral constants, so the following code works:
// template <int n>, but n is not used, so we can ignore the name.
template <int>
void foo(std::vector<int>* x) {
}
int main () {
foo<4>(0);
}
and so is the following:
typedef int U;
// template <U n>, but n is not used, so we can ignore the name.
template <U>
void foo(std::vector<U>* x) {
}
int main () {
foo<4>(0);
}
This is why I asked if U
is a typedef in the comment.
I think it was just an error of the person asking that forgot to add the "typename" or "class". The answers just copy/pasted the code, and it is also bad.
I'm sure U is a macro. I don't think a mere typedef would work in place of U, since compilers have to see either of the two keywords 'class' or 'typename' in the brackets in order for templates to compile.
Whoever put 'U' in there was a little too clever for their own good. Thus your confusion.
Welcome to the world of maintaining other peoples dirty code.
If U is a type than this is a template specialization
精彩评论