`не называет ошибку типа в С++

Я не знаю, что искать, чтобы найти объяснение для этого, поэтому я спрашиваю. У меня есть этот код, который сообщает об ошибке:

struct Settings{
    int width;
    int height;
} settings;

settings.width = 800; // 'settings' does not name a type error
settings.height = 600; // 'settings' does not name a type error

int main(){
    cout << settings.width << " " << settings.height << endl;

но если я поместил назначение значения в main, он будет работать:

struct Settings{
    int width;
    int height;
} settings;

main () {
    settings.width = 800; // no error
    settings.height = 600; // no error

Можете ли вы объяснить мне, почему?

EDIT:
Что касается ответа Ральфа Тандецки, вот мой полный код структуры. Не могли бы вы показать мне, как назначать значения так же, как и в моей структуре фрагмента?

struct Settings{
    struct Dimensions{
        int width;
        int height;
    } screen;

    struct Build_menu:Dimensions{
        int border_width;
    } build_menu;
} settings;

Ответ 1

Вы не можете назначать задания вне контекста функции на С++. Если вас озадачивает тот факт, что вы иногда видели символ =, используемый вне контекста функции, например:

int x = 42; // <== THIS IS NOT AN ASSIGNMENT!

int main()
{
    // ...
}

Это означает, что символ = также может использоваться для инициализации. В вашем примере вы не инициализируете члены данных width и height, вы присваиваете им значение.

Ответ 2

В С++ 11 вы можете написать

struct Settings {
    int width;
    int height;
} settings = { 800, 600 };

чтобы исправить вашу ошибку. Ошибка появляется, потому что вы пытаетесь присвоить значение вне тела функции. Вы можете инициализировать, но не назначать глобальные данные вне функции.

EDIT:

Что касается вашего редактирования, просто напишите

Settings settings = {{800, 600}, {10, 20, 3}};

Я не уверен на 100%, если это работает, из-за наследования. Я бы рекомендовал избежать наследования в этом случае и записать Dimensions как данные элемента в вашу структуру Build_menu. Наследование рано или поздно даст вам всевозможные проблемы, когда будет использоваться таким образом. Предпочитаете композицию для наследования. Когда вы это сделаете, это будет выглядеть как

Settings settings = {{800, 600}, {{10, 20}, 3}};