2012-07-02 9 views
6

ich den folgenden Code wurde kompiliert:Unvollständige Art in verschachtelten name-Bezeichner namens

class B; 

class A { 
    A(); 
    friend A B::newAObject(); 
}; 

class B { 
    friend A::A(); 
public: 
    A newAObject(); 
}; 

Das mag seltsam erscheinen, aber die Idee war, eine Klasse zu haben A, die nur durch ein Objekt vom Typ hergestellt werden könnte B (wer wäre wahrscheinlich ein Singleton).

Das Problem ist, dass ich eine zirkuläre Abhängigkeit zwischen diesen Objekten erstellt habe. A muss vor B definiert sein, und B muss vor A definiert werden. Offensichtlich vorwärts zu deklarieren B ist nicht gut genug, B muss tatsächlich vor A (und umgekehrt) vollständig definiert werden.

Wie kann ich das umgehen?

Edit: der eigentliche Fehler ist: Unvollständige Typ 'B' in geschachtelten Namen Spezifizierer benannt.

Hinweis: Es gibt einen anderen Beitrag, der dem hier ähnlich ist: Error: incomplete type used in nested name specifier, aber es ist stark templatiziert und das hat mich verwirrt, daher dieser Beitrag.

+1

Es ist ein wenig seltsam, eine einzige Methode zu einem Freund zu machen. Bist du sicher, dass du nicht die ganze Klasse zu einem Freund machen willst? –

+0

Mir war nicht bewusst, dass das möglich war. Wie wird es gemacht? schreibe ich 'Freundklasse B' innerhalb von' A' und 'Freundklasse A' in' B'? – anthropomorphic

+1

Das stimmt ... –

Antwort

5

C++ 2003 besagt, dass beim Zugriff auf den Inhalt der Klasse diese Klasse vollständig definiert sein sollte. Die Vorwärtsdeklaration ist nicht genug. Das bedeutet, dass zirkuläre Abhängigkeiten wie Ihre einfach nicht erlaubt sind.

p.s. Die gesamte Klasse als Freund zu deklarieren, sollte funktionieren, wenn dies alles ist, was Sie brauchen.

By the way, Freund Spezifikation erzeugt für die Klasse Forward-Deklaration, in den folgenden Code aussehen:

void F10(C1 &p1); 

class C2 
{ 
    friend class C1; 
}; 

void F11(C1 **p1); 

Compiler für F10 Syntaxfehler geben, weil C1 nicht definiert ist, aber F11 wird wegen der feinen kompilieren Freundspez. Dies mag seltsam klingen, aber dies ist im Standard definiert und Compiler folgen diesem.

+0

Beide Klassen als Freunde des anderen zu erklären, funktionierte für mich. Vielen Dank. – anthropomorphic

Verwandte Themen