Первый раз встретил данную конструкцию, когда 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>
разницы нет.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Реализовал класс строк, и сделал оператор >> , когда ввожу строчку с пробелами , например а ааыаыв аы, то выводит только первый символ, то бишь...
необходимо сделать фильтр для бдЕсть поля в них нужно вписать значение, которое потом должно перейти в запрос и вывести результат в tableView