Frage

Wer weiß, warum typedefs von Klassennamen funktioniert nicht wie Klassennamen für den Freund Erklärung?

class A
{
public:
};

class B : public A
{
public:
   typedef A SUPERCLASS;
};

typedef A X;

class C
{
public:
   friend class A;             // OK
   friend class X;             // fails
   friend class B::SUPERCLASS; // fails
};
War es hilfreich?

Lösung

Es kann nicht, zur Zeit. Ich weiß nicht, den Grund noch (schaut sie auf, weil ich es interessant finden). Update: Sie den Grund in dem ersten Vorschlag finden typedef-Namen als Freunde zu unterstützen: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1520.pdf . Der Grund dafür ist, dass die Norm nur unterstützt, erarbeitet Typ-Spezifizierer. Es ist einfach nur diejenigen, zu ermöglichen und sagen, wenn das Unternehmen erklärt, als Freund noch nicht erklärt ist, wird es ein Mitglied des umgebenden Namensraumes vorgenommen werden. Das bedeutet aber, dass, wenn Sie einen Template-Parameter verwenden möchten, würden Sie tun müssen (eine Klasse erforderlich ist dann zum Beispiel)

friend class T;

Aber das brachte weitere Probleme, und es wurde gedacht, nicht den Gewinn wert. Nun schlägt das Papier zusätzlicher Typ zu ermöglichen Planer gegeben werden (so dass diese dann Verwendung von Template-Parametern und typedef-Namen erlaubt).

Die nächste C ++ Version (durch 2010) wird in der Lage sein, es zu tun.

Sehen Sie diesen aktualisierten Vorschlag zur Standard: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf . Es wird nicht nur typedef Namen erlaubt, sondern auch Template-Parameter als den als Freund deklarierten Typ verwendet werden.

Andere Tipps

AFAIK, In C ++ typedef schafft nicht ein vollwertiges Synonyme, wenn sie in Verbindung mit Klassen verwendet. Mit anderen Worten, mag es keinen Makro.

Unter den Einschränkungen ist, dass das Synonym nicht nach einer Klasse oder Struktur Präfix auftreten kann, oder als destructor oder Konstruktor Namen verwendet werden. Sie können auch das Synonym nicht Unterklasse. Ich würde wetten, dass wird auch bedeutet, dass Sie es nicht Freund.

habe ich versucht, in dem 8.0 der Code VC ++:

...
class C
{
public:
  friend class A;       
  friend X;             
  friend B::SUPERCLASS; 
};
...

Es wird ohne Fehler kompiliert.

Ich bin mir nicht bekannt, ob es MS spezifisch oder nicht.

Ein typedef definiert einen Typ. Freund decls erklären Freund Klassen oder Funktionen (im Wesentlichen Scopes), die dann „Zugang“ haben in den nicht öffentlichen Bereich der deklarierte Klasse ...

Primitives, das heißt ein Schwimmer oder ein int * keinen Rahmen mit Code usw. definieren, sie ohnehin nicht die Klasse „verwenden“.

Vergessen Sie nicht, können Sie auch „Pack“ Aufrufkonventionen, Ausrichtung attribs und andere Compiler spezielle Sachen in einem typedef, das heißt mehrere Vektortypen, die von der gleichen Klasse implementiert, jedoch mit deutlicher Ausrichtung attribs. => A-Typ ist keine Klasse, aber umgekehrt.

IMHO, typedef einen Freund erklären kann nützlich sein, aber wenn „Klasse typedefs“ von überall als Freund eingestellt wird, können die Freundschaften äußerst unverständlich worden und deshalb fehleranfällig, vor allem, wenn Vorlagen übermäßig verwendet werden.

Invalidierung ein einziges typedef kann Chaos des ganze Projekt wegen der weit verbreiteten Abhängigkeiten auf. Vorlage Freunde und die 0x-Vorlage typedefs sind nützlich, aber nicht an die Regeln eines Freundes Erklärung entspannen.

Ich weiß nicht, jeden Vorschlag betreffend Freund typedefs.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top