Я хочу знать, есть ли разница между:
template <typename T>
class foo{
foo<T>(){};
};
template<typename T>
class foo{
foo(){};
};
Кажется, что оба работают, но я не понимаю разницу между ними. Первый смущает меня, я не понимаю, какова роль < T> здесь.
Согласно правилу нагнетаемого имя класса, они одно и то же.
$ 14.6.1 / 1 Локально объявленные имена [temp.local]:
Как и обычные (не шаблонные) классы, шаблоны классов имеют
имя введенного класса (пункт [класс]). Имя введенного класса может быть
используется в качестве имени шаблона или имени типа. Когда он используется с
список аргументов шаблона, как аргумент шаблона для шаблона
параметр шаблона, или как окончательный идентификатор в
подробный спецификатор типа объявления шаблона класса друга,
ссылается на сам шаблон класса. В противном случае это эквивалентно
имя шаблона, за которым следуют параметры шаблона класса
шаблон заключен в <>.
Так foo
а также foo<T>
обратитесь к тому же самому здесь. Более конкретно,
Первый смущает меня, я не понимаю, какова роль < T> здесь.
Вы используете inject-class-name foo
с параметром шаблона T
(Т.е. foo<T>
), который относится к самому классу шаблона.
Других решений пока нет …