Mr. Boy
Mr. Boy

Reputation: 63720

In C++ what does template<> mean?

It's not a syntax I'm familiar with, but I saw it in another question, an example being:

template<> struct Allowed<std::string> { };

What does template<> actually mean, with no template type/parameter?

Upvotes: 58

Views: 54937

Answers (3)

Mephane
Mephane

Reputation: 2022

It is a template specialization. The typical case would be partial specialization:

#include <iostream>

template<class T1, class T2>
struct foo
{
  void doStuff() { std::cout << "generic foo "; }
};

template<class T1>
struct foo<T1, int>
{
 void doStuff() { std::cout << "specific foo with T2=int"; }
};

As you can see, the specialization removes one element from the template parameters and explicitly states a type instead of the removed one. That means if there is only one template type, the <> just become empty:

template<class T1>
struct bar
{
  void doStuff() { std::cout << "generic bar"; }
};

template<>
struct bar<int>
{
 void doStuff() { std::cout << "specific bar with T1=int"; }
};

Upvotes: 51

CashCow
CashCow

Reputation: 31435

You might just say it is just the required syntax.

The normal syntax would be template< typename T > struct Allowed;

Because we know that in this case T is std::string there is nothing to put inside the angled brackets but the word template and the angled brackets are still required because writing struct Allowed<std::string> on its own would not imply that you are specializing the template but simply that you are instantiating one with std::string as the type. (The word "struct" is not necessary to do that but is still permitted).

Upvotes: 14

Puppy
Puppy

Reputation: 146910

It's a specialization. template<> means that the specialization itself is not templated- i.e., it is an explicit specialization, not a partial specialization.

Upvotes: 31

Related Questions