Первый раз встретил данную конструкцию, когда class в параметрах функции и не могу понять для чего оно используется?
virtual void SetupInputComponent(class UInputComponent* InputComponent) override;
Эта штука ({class|struct|union|enum} имя) называется elaborated type specifier.
Между UInputComponent и class UInputComponent почти нет разницы.
1. Естественно, если справа от class написать не класс, а другой тип - это ошибка.
2. Если UInputComponent еще не был объявлен, то class UInputComponent не вызывает ошибку, а объявляет класс в текущем namespace (даже если мы внутри класса, объявляется все равно не в нем, а в самом вложенном namespace).
Это работает только если имя неквалифицированное (не содержит ::). Если оно квалифицированное и такой класс еще не был объявлен - это ошибка.
3. Elaborated type specifier нужен когда название класса совпадает с названием еще чего-то:
class A {};
void foo()
{
int A;
A ptr; // error: must use 'class' tag to refer to type 'A' in this scope
class A ptr; // ok
}
4. Elaborated type specifier убирает необходимость в typename в шаблонах:
struct A
{
class B{};
};
template <typename T = A> struct C
{
T::B y; // error: missing 'typename' prior to dependent type name 'T::B'
typename T::B x; // ok
class T::B y; // ok
};
C c;
Но typename работает для всех типов, а class - только для классов. Не стоит путать elaborated type specifier с объявлением шаблонных параметров: между template <typename T> и template <class T> разницы нет.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости