开发者

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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜