2013-03-20 24 views
16

anlamını değiştirir:Beyanı aşağıdaki kodu için sembol

struct foo {}; 

struct A 
{ 
    typedef foo foo_type; 

    void foo(); 
}; 

GCC bir derleyici hata veriyor:

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 {}; 
     ^

Ama clang derleyici hataları olmadan kabul eder. Kim haklı? typedef typedef ::foo foo_type kaldırıldı veya değiştirilirse, gcc, clang hem kod kabul etmesini

Not.

+0

Asıl soru şu: * Neden * Clang her zaman haklıdır? –

+1

yazım hatası olmadığında o zaman garip değil – 4pie0

+0

@ cf16: Ben öyle demedim. Ben sadece, yazım hatası söz değil, hataya rağmen, typedef hata ile ilgili bir şey var, işaret etmek istedim. – HighCommander4

cevap

17

gcc doğru fakat çınlama tanısal (3.3.7) verecek şekilde gerekli değildir:

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.

Bunun nedeni sınıf kapsamı nasıl çalıştığının olduğunu. void foo(); arasında foo sınıfı A arasında tüm kapsamında görünür, yani void foo(); beyanı fonksiyonu foo adına struct foo atıfta gelen Typedef içinde foo anlamını değiştirir.

İlgili konular