Если компилятор сам не поймет, что someClass
- это шаблонный класс, который принимает <typename Item>
?
Когда компилятор увидит ::
,он еще не знает, что вы на самом деле делаете .Все, что он видит, это то, что слева от этого знака.Таким образом, он видит заголовок шаблона, за которым следует имя типа (void
), за которым следует имя шаблона класса, за которым следует оператор области видимости (::
).Вот и все.
Шаблоны на самом деле не существуют в C ++;они являются механизмом времени компиляции для создания вещей: классов, функций и переменных в C ++ 14.Имя шаблона именует шаблон, но имя, за которым следуют его параметры шаблона, - это то, что фактически создает то, для чего предназначен шаблон.someClass
называет шаблон класса;someClass<Item>
называет класс , а не шаблон класса.
И после имени класса может следовать ::
.
То, что вы в основном проситедля компилятора, чтобы посмотреть на заголовок шаблона, увидеть, что имя, которое вы дали параметру шаблона (s?), совпадает с именем, заданным для параметров шаблона шаблона someClass
, и затем автоматически подставить его в.Это просто не так, как работает C ++.То, что вы запрашиваете, не сильно отличается от ожидания, что компилятор заполнит параметры функции только потому, что имя переменной на сайте вызова случайно совпадает с именем параметра в вызываемой функции.
Имена параметров, будь то функция или шаблон, не имеют значения в C ++.Они просто идентификаторы;они имеют значение только в рамках того, что объявляет эти имена.Имена параметров функции имеют значение только в пределах определяемой функции.И имена параметров шаблона имеют значение только в пределах рассматриваемого заголовка шаблона.
Ваш класс использует заголовок шаблона, отличный от определения вашего члена.Так что имена просто не имеют значения, что касается C ++.Совершенно верно сделать это:
template <typename Foo>
void someClass<Foo>::increment() {
x++;
}
То, что вы хотите, это не то, как работает C ++.Да, в C ++ есть места, где полное имя шаблона может быть выведено на основании контекста, в котором он используется.Но они не основаны на простых именах параметров;они основаны на аргументах, переданных на сайте вызова.