2013-03-20 5 views
16

の意味を変更します。宣言は、次のコードのシンボル

struct foo {}; 

struct A 
{ 
    typedef foo foo_type; 

    void foo(); 
}; 

GCCはコンパイラエラーを与える:

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

しかし、打ち鳴らすには、コンパイルエラーなしで、それを受け入れます。誰が正しい? typedefが削除、またはtypedef ::foo foo_typeに変更された場合、GCCと打ち鳴らす両方のコードを受け入れること

注。

+0

本当の問題は、次のとおりです。* *は常に右打ち鳴らすのはなぜ?何のtypedefがないとき –

+1

が、それはcf16 @ – 4pie0

+0

不思議ではない。私はそれがあったと言っていませんでした。私はただのtypedefに言及していないエラーにもかかわらず、typedefではエラーとは何かを持っている、ということを指摘したかったです。 – HighCommander4

答えて

17

GCCは正しいですが、打ち鳴らすは、(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.

これが原因でクラススコープの仕組みです。 void foo();fooクラスA全体範囲内に表示されているので、void foo();の宣言は、関数fooの名前をstruct fooを参照からのtypedefでfooの意味を変化させます。

関連する問題