Mat
Mat

Reputation: 2793

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 all?

thanks!

the thread in question: Problems writing a copy constructor for a smart pointer

Upvotes: 4

Views: 9519

Answers (4)

kennytm
kennytm

Reputation: 523214

That code is wrong (typo). There must be a typename or class in this situation.


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.

Upvotes: 15

Diego Sevilla
Diego Sevilla

Reputation: 29011

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.

Upvotes: 2

harper
harper

Reputation: 13690

If U is a type than this is a template specialization

Upvotes: 0

C.J.
C.J.

Reputation: 16081

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.

Upvotes: 0

Related Questions