2009-03-18 8 views
22

The g ++ kompilator narzeka z tego błędu, gdy Oświadczam znajomego wygląda następująco:klasa klucz musi być zadeklarowane podczas deklarowania znajomego

friend MyClass; 

zamiast

friend class MyClass; 

Dlaczego klasasłowo kluczowe jest wymagane? (kompilator Borland C++, BTW, nie wymaga tego).

Czy kompilator nie mógł po prostu wyszukać MyClass w tabeli symboli i stwierdzić, że została zadeklarowana jako klasa? (oczywiście robi to sprawdzanie, ponieważ narzeka, gdy MyClass nie zostało zadeklarowane)

To nie jest tak, że składa deklarację klasy: Nadal muszę mieć albo klasę powyżej, albo przynajmniej zgłosiło to napastnik.

Byłoby dla mnie sensu (byłoby świetnie faktycznie) jeśli

friend class MyClass; 

pędzi do przodu deklarację w razie potrzeby, w przeciwnym razie po prostu wydaje się składniowej soli do mnie.

byłem wesoło użyciu przyjaciela wypowiedzi bez klasa lub struct hasła bez skarg kompilator prawie 20 lat. Czy jest to coś całkiem nowego?

+1

20 lat! Musiałeś pracować z Bjorn. –

+0

Użyłem C-Front, kiedy byłem w szkole średniej około 1989 roku. Używam głównie Borland C++ od około 1991. –

+3

@Martin: Bjorn ?! Lol. –

Odpowiedz

22

byłem zaskoczony tym (iw rezultacie usunięte poprzednią błędną odpowiedź). Standard C++ 03 mówi w 11.4:

Specyfikator typu opracowanego należy stosować w deklaracji przyjaciela dla klasy.

Następnie upewnić się, że nie ma nieporozumień, to że z przypisami:

wymagana jest klasa-key z opracowanego-type-specyfikacją.

GCC jest jedyną kompilator, że mam to narzeka brakującej klasy-key, ale wygląda na to inne kompilatory są pozwalając nam uciec z czymś nietypowych ...

Teraz jak dla Uzasadnienie - musisz zapytać kogoś, kto wie więcej o kompilatorach (lub standardach) niż ja.

+2

' friend' bez class-key działa w g ++ 4.7.0/4.7.3 z opcją '-std = C++ 11' – Interarticle

+0

Byłoby lepiej Jeśli zaktualizujesz swoją odpowiedź zgodnie z C++ 11 również, C++ 11 wprowadziło __rozszerzone deklaracje przyjaciół__. Zobacz https://www.ibm.com/developerworks/community/blogs/5894415f-be62-4bc0-81c5-3956e82276f3/entry/introduction_to_the_c_11_feature_extended_friend_declaration3?lang=en – Destructor

22

Do punktu Twojego pytania, , ponieważ tak jest w ISO/IEC 14882: 2003, które określa je jako (sekcja 7.1.4). friend konstrukt jest zasadniczo określone jako:

friend <declaration> 

gdzie <declaration> jest ważna deklaracja klasy, struct, szablon, lub funkcji.

Zatem

MyClass; 

nie jest ważna deklaracja, przy czym:

class MyClass; 

lub:

struct MyClass; 

są.

Idem dla, odpowiednio:

friend class MyClass; 

lub

friend struct MyClass; 
+0

Dziękuję za to, dziś uratowaliście mi bekon. – Rokujolady

+0

Dobra odpowiedź, GCC rocks :) – ierax

+0

A jeśli 'MyClass' jest szablonem klasy, deklaracja' friend' wymaga 'template' również –

Powiązane problemy