简体   繁体   中英

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

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.

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.

如果U是一个类型,那么这是一个模板专门化

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM