Разница между добавлением и пропуском параметра шаблона для имени класса внутри конструктора

Я хочу знать, есть ли разница между:

template <typename T>
class foo{
foo<T>(){};
};

template<typename T>
class foo{
foo(){};
};

Кажется, что оба работают, но я не понимаю разницу между ними. Первый смущает меня, я не понимаю, какова роль < T> здесь.

1

Решение

Согласно правилу нагнетаемого имя класса, они одно и то же.

$ 14.6.1 / 1 Локально объявленные имена [temp.local]:

Как и обычные (не шаблонные) классы, шаблоны классов имеют
имя введенного класса (пункт [класс]). Имя введенного класса может быть
используется в качестве имени шаблона или имени типа. Когда он используется с
список аргументов шаблона, как аргумент шаблона для шаблона
параметр шаблона, или как окончательный идентификатор в
подробный спецификатор типа объявления шаблона класса друга,
ссылается на сам шаблон класса. В противном случае это эквивалентно
имя шаблона, за которым следуют параметры шаблона класса
шаблон заключен в <>.

Так foo а также foo<T> обратитесь к тому же самому здесь. Более конкретно,

Первый смущает меня, я не понимаю, какова роль < T> здесь.

Вы используете inject-class-name foo с параметром шаблона T (Т.е. foo<T>), который относится к самому классу шаблона.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]