Требуется спецификатор типа: вложенные классы. C++

403
11 января 2020, 05:50

При попытке инициализации члена класса, являющегося при этом объектом вложенного класса, возникает ошибка. Вот код:

class rage 
{
public:
    rage() { }
private:
    class test
    {
    public:
        test(int y) { }
    };
    test heythere(5);  // <-- Ошибка тут
};
int main()
{
}

Visual Studio кричит об ошибке в строчке test heythere(5);, подчеркивает 5 и говорит, что требуется спецификатор типа, но это мало мне о чём говорит.

Answer 1
test heythere(5);

main.cpp:31:19: error: expected identifier before numeric constant
main.cpp:31:19: error: expected ',' or '...' before numeric constant

Если вы инициализируете поле прямо в теле класса, нужно использовать либо = …, либо {…}.

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

На это намекает даже название такого инициализатора в грамматике языка: brace-or-equal-initializer.

Подойдет один из следующих вариантов, на выбор:

test heythere = 5;
test heythere = test(5);
test heythere{5};
test heythere = {5};
test heythere = test{5};

Конкретно в этом случае все пять ведут себя совершенно одинаково, но в общем случае между ними есть разница. Подробнее тут: https://en.cppreference.com/w/cpp/language/initialization

Еще вариант: Оставить только test heythere;, а инициализацию выполнять в списке инициализации в конструкторе: rage() : heythere(5) {...}. (Либо : heythere{5}.)

READ ALSO