2013-03-20 13 views
16

dla następującego kodu:Deklaracja metody zmienia znaczenie symbolu

struct foo {}; 

struct A 
{ 
    typedef foo foo_type; 

    void foo(); 
}; 

GCC daje błąd kompilatora:

test.cpp:7:14: error: declaration of 'void A::foo()' [-fpermissive] 
    void foo(); 
      ^
test.cpp:1:8: error: changes meaning of 'foo' from 'struct foo' [-fpermissive] 
struct foo {}; 
     ^

Ale dzyń akceptuje je bez błędów kompilatora. Kto ma rację?

Należy pamiętać, że jeśli typedef został usunięty lub zmieniony na typedef ::foo foo_type, zarówno gcc jak i clang akceptują kod.

+0

Prawdziwe pytanie brzmi: * Dlaczego * czy Clang zawsze ma rację? –

+1

kiedy nie ma typedef, to nie jest dziwne – 4pie0

+0

@ cf16: Nie powiedziałem, że to było. Chciałem tylko wskazać, że pomimo błędu, który nie wspomniał o typedef, typedef ma coś wspólnego z błędem. – HighCommander4

Odpowiedz

17

gcc jest poprawna, ale dzyń nie jest wymagane, aby dać diagnostyczny (3.3.7):

A name N used in a class S shall refer to the same declaration in its context and when re-evaluated in the completed scope of S. No diagnostic is required for a violation of this rule.

To dlatego, jak działa zakres klasy. foo z void foo(); jest widoczny w całej zakresu klasy A, więc deklaracja void foo(); zmienia znaczenie foo w typedef z powołując się struct foo nazwy funkcji foo.