Чтобы объяснить, почему это происходит, это происходит из-за того, что когда компилятор смотрит на структуру или класс, он должен иметь возможность определить его точный размер, среди прочего, чтобы знать, сколько памяти ему нужновыделить для экземпляров этих.
В этом случае компилятор не может определить размер Entry
, потому что он знает только, что существует класс Setting
, но еще не знает его размер.
Использование указателя, то есть:
class Setting;
class Entry
{
Setting* Setg;
};
фактически решает эту проблему, потому что, хотя компилятор все еще ничего не знает о Setting
, он все же знает размер указателя(независимо от типа получателя).
Как уже упоминалось, «вложенная» часть на это не влияет.