Это недействительно.Синтаксис допускает произвольные объявления, но 8.3.5p8 говорит:
Идентификатор может быть необязательно предоставлен в качестве имени параметра;если присутствует в определении функции (8.4), он называет параметр (иногда называемый «формальным аргументом»)
Edit Другая цитата, которая синтаксически ограничивает деклараторы (8.3p1, [dcl.meaning]):
Каждый декларатор содержит ровно один идентификатор декларатора;он называет идентификатор, который объявлен.Идентификатор id объявления-идентификатора должен быть простым идентификатором, за исключением объявления некоторых специальных функций (12.3, 12.4, 13.5) и объявления специализаций шаблона или частичных специализаций (14.7).Идентификатор объявления не должен уточняться, за исключением определения функции-члена (9.3) или статического члена данных (9.4) или вложенного класса (9.7) вне его класса, определения или явного создания экземпляра функции, переменной или члена классапространства имен вне его пространства имен, или определение ранее объявленной явной специализации вне его пространства имен, или объявление функции-друга, которая является членом другого класса или пространства имен (11.4).
Таким образом, в объявлении параметра нельзя использовать квалифицированные имена.
Редактировать : В отредактированной форме тип параметра функции уменьшается до int*
, даже до начала тестаСделано, существует ли T::count
на самом деле и является целочисленной константой.Если вам нужен пример, в котором квалифицированное имя в такой сигнатуре могло бы сделать что-то значимое, рассмотрим
template<class T>
struct sample
{
void fun(int S=T::count);
};
Когда вызывается fun
без параметра, компилятору необходимо определить аргумент по умолчанию, который затем завершится неудачно, еслиT
не имеет члена count
или не может быть преобразовано в int
.