2009-03-18 12 views
22

Il compilatore g ++ si lamenta con questo errore quando dichiaro un amico nel seguente modo:una chiave di classe deve essere dichiarata quando si dichiara un amico

friend MyClass; 

invece di

friend class MyClass; 

Perché dovrebbe l'classe parola chiave richiesta? (il compilatore Borland C++, BTW, non lo richiede)

Il compilatore non può semplicemente cercare MyClass nella tabella dei simboli e dire che è stato dichiarato come classe? (ovviamente sta facendo la ricerca comunque perché si lamenta quando MyClass non è dichiarato)

Non è come se stesse facendo una dichiarazione in avanti della classe: devo ancora aver dichiarato la classe sopra o almeno hanno inoltrato la dichiarazione.

Avrebbe senso per me (sarebbe grande realtà) se

friend class MyClass; 

fa una dichiarazione anticipata, se necessario, altrimenti sembra proprio come il sale sintattico a me.

ho allegramente usando amico dichiarazioni senza la parola chiave classe o struct con nessuna lamentela compilatore per quasi 20 anni. È qualcosa di abbastanza nuovo?

+1

20 anni! Devi aver lavorato con Bjorn. –

+0

Ho usato C-Front quando frequentavo la scuola di specializzazione nel 1989. Ho usato principalmente Borland C++ dal 1991. –

+3

@Martin: Bjorn ?! Lol. –

risposta

22

Sono rimasto sorpreso di questo (e di conseguenza cancellato una risposta errata precedente). Lo standard C++ 03 dice in 11.4:

Un identificativo del tipo elaborato deve essere utilizzato in una dichiarazione di amicizia per una classe.

Poi per assicurarsi che non c'è alcun equivoco, note a piè pagina che, con:

è richiesto Il tasto classe del tipo-specifier elaborato.

GCC è l'unico compilatore che ho che lamenta la classe-chiave mancante, ma sembra che altri compilatori sono facendoci uscire con qualcosa di non standard ...

Ora per quanto riguarda la logica - dovresti chiedere a qualcuno che ne sa di più sui compilatori (o sugli standard) di me.

+2

' friend' senza chiave di classe funziona sotto g ++ 4.7.0/4.7.3 con opzione '-std = C++ 11' – Interarticle

+0

Sarebbe meglio Se aggiorni la tua risposta anche in C++ 11, C++ 11 ha introdotto __dirette di amico esteso__. Vedere https://www.ibm.com/developerworks/community/blogs/5894415f-be62-4bc0-81c5-3956e82276f3/entry/introduction_to_the_c_11_feature_extended_friend_declaration3?lang=it – Destructor

22

Al punto della domanda, perché è il modo in cui lo standard ISO/IEC 14882: 2003 lo specifica (sezione 7.1.4). Il friend costrutto è essenzialmente specificato come:

friend <declaration> 

dove <declaration> è la dichiarazione valida di una classe, struct, sagoma, o funzione.

Così,

MyClass; 

non è una dichiarazione valida, mentre:

class MyClass; 

o:

struct MyClass; 

sono.

Idem per, corrispondentemente:

friend class MyClass; 

o

friend struct MyClass; 
+0

Grazie per questo, voi ragazzi avete salvato il bacon oggi. – Rokujolady

+0

Bella risposta, rocce GCC :) – ierax

+0

E se 'MyClass' è un modello di classe, la dichiarazione' friend' richiede 'template' anche –

Problemi correlati