Question:
The first time I met this construction, when the class
is in the function parameters and I can’t understand what it is used for?
virtual void SetupInputComponent(class UInputComponent* InputComponent) override;
Answer:
This thing ( {class|struct|union|enum} имя
) is called an elaborated type specifier .
There is almost no difference between UInputComponent
and class UInputComponent
.
1. Naturally, if you write not a class to the right of the class
, but another type, this is an error.
2. If UInputComponent
has not yet been declared, then class UInputComponent
does not cause an error, but declares the class in the current namespace
(even if we are inside the class, it is still not declared in it, but in the nested namespace
itself).
This only works if the name is unqualified (does not contain ::
). If it is qualified and such a class has not yet been declared, it is an error.
3. Elaborated type specifier is needed when the class name matches the name of something else:
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 removes the need for typename
in templates:
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;
But typename
works for all types, while class
only works for classes. Don't confuse an elaborated type specifier with a template parameter declaration: there is no difference between template <typename T>
and template <class T>
.