Почему вы не можете определить шаблон со структурой? - PullRequest
3 голосов
/ 12 марта 2012

Довольно просто:

template <class T>
void foo() {}  //compiles

template <struct T>
void goo() {}  //doesn't

Почему?

Ответы [ 3 ]

6 голосов
/ 12 марта 2012

class является только ключевым словом, указывающим, что T является типом.На самом деле это не означает, что T должен быть классом.(например, вы можете позвонить foo<int>().)

Ключевое слово class использовалось, потому что typename не существовало, когда была добавлена ​​функция шаблона.См. Шаблоны в c ++, typename и классе .

2 голосов
/ 12 марта 2012

Поскольку шаблон должен быть объявлен с class или ...

template <typename T>
void foo() {}
1 голос
/ 12 марта 2012

Потому что грамматика запрещает это:

template-declaration: 

export_opt template< template-parameter-list > declaration

template-parameter-list:
template-parameter
parameter-declaration

type-parameter:

class identifier
class identifier = type-id
typename identifier
typename identifier = type-id
template < template-parameter-list > class identifier
template < template-parameter-list > class identifier = template-name

В качестве альтернативы вы можете подумать, что struct - это особый случай класса, в котором все члены являются публичными. Таким образом, включение его в список параметров шаблона не будет таким общим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...