В C ++ каждое выражение, которое выглядит как объявление функции, является объявлением функции.Рассмотрим более сложный пример из вашего вопроса:
#include <iostream>
struct X
{
X( int value ) : x(value) {}
int x;
};
struct Y
{
Y( const X& x ) : y(x.x) {}
int y;
};
int main()
{
int test = 10;
Y var( X(test) ); // 1
std::cout << var.y << std::endl; // 2
return 0;
}
На первый взгляд (1) это объявление локальной переменной var
, которая должна быть инициализирована временным типом X
.Но это выглядит как объявление функции для компилятора, и вы получите ошибку в (2):
error: request for member ‘y’ in ‘var’, which is of non-class type ‘Y(X)’
Компилятор считает, что (1) - это функция с именем var
:
Y var( X test );
^- return value ^-function name ^-type of an argument ^-argument name
Теперь, как сказать компилятору, что вы не хотите объявлять функцию?Вы можете использовать дополнительные скобки следующим образом:
Y var( (X(test)) );
В вашем случае MainGUIWindow myWindow()
для компилятора выглядит как объявление функции:
MainGUIWindow myWindow( void )
^- return value ^-function name ^-type of an argument