nach dem Standard C++,innere Element Sichtbarkeit in der Klasse
9.2 [class.mem]:
A class is considered a completely-defined object type (3.9) (or complete type) at the closing } of the class-specifier. Within the class member-specification, the class is regarded as complete within function bodies, default arguments, using-declarations introducing inheriting constructors (12.9), exception-specifications, and brace-or-equal-initializers for non-static data members (including such things in nested classes). Otherwise it is regarded as incomplete within its own class member-specification
So sollte der folgende Code kompilieren, und in der Tat hat es
struct Foo{
Foo()
{
Bar bar; // Bar is fully visible here, even though it's defined later
}
//void f(Bar){} // But NOT VISIBLE if used as a function parameter
struct Bar{};
};
int main()
{
Foo foo;
}
Allerdings, wenn ich Kommentar- die Zeile, die die Elementfunktion void Foo::f(Bar)
definiert, dann kann der Code nicht mit dem Fehler
error: 'Bar' has not been declared
Beim erneuten Lesen des Standards scheint es tatsächlich so zu sein, dass Funktionsparameter nicht als Orte betrachtet werden, an denen die Klasse als abgeschlossen betrachtet wird. Es macht jedoch überhaupt keinen Sinn. Können Sie etwas Licht, warum kann ich nicht Bar
in einem Funktionsparameter verwenden (aber ansonsten kann es innerhalb eine Funktion ohne irgendwelche Probleme überhaupt) vor seiner vollständigen Definition verwenden?
Meine Die beste Vermutung ist, dass die Funktion selbst erst dann "evaluiert" wird, wenn "struct Foo" vollständig ist und somit "Bar" verfügbar ist. Bei der Funktionsdeklaration muss der Typ bekannt sein, um die Funktionssignatur erzeugen zu können. Sie erhalten das gleiche Problem beim Definieren eines typedef, nachdem Sie versuchen, den Typ in einer Funktionsdeklaration zu verwenden. – RedX
Bei dieser Frage geht es eher um die Namenssuche als um die Vollständigkeit des Klassentyps. –
@RedX und T.C., ich sehe jetzt, ich glaube, du hast Recht. Wenn Sie eine Antwort schreiben können, nehme ich sie gerne an. – vsoftco