2011-07-25 4 views
2

このリンクヘルプは、非修飾名のルックアップに私の疑問を明確に:ISOのn3290ドラフト

A point from C++0x draft : n3290

このプログラムは修正しなければであるによると?

EX: 
namespace X {}; 
enum Foo 
    { 
     X = 0,  #1 
     Y, 
     Z = X // X refers to the enum, not the type 
    }; 

//#1「X」のように実行このプログラムをしながら、IAMのは、エラーを取得して、シンボル

別の種類としてではなく、上記の文のリンク...列挙型指定子を含む名前空間スコープで再宣言しました。 ...など

疑問を明確にしてください。

は、そうでない場合はいずれも 名前空間

答えて

1

元の質問ではなくnamespace Xstruct Xを持っていたことに差があると私は(リンクで)上記の文を証明する例を教えてください。名前空間名はこのスコープ内に見え、Foo :: Xもenum名が周囲の名前空間に「リーク」するのに伴って表示されます。それは紛争を起こす。

struct/class/unionの名前は別の "タグ名前空間"(別の意味を持つCの言葉)にあり、同じ名前を使って別の項目を宣言することができます同じスコープ内:

Difference between 'struct' and 'typedef struct' in C++?

+0

しかし、構造体Xの例では、上記のISO文に矛盾は生じませんが、ネームスペースの面では機能していません...理由を知っているかもしれません...なぜですか?それを説明してください – user751747

+0

私はそれをやったと思った。 :-)構造体を使うと、別の構造体を宣言して名前を隠すことができます。とにかく 'struct X'を書くことでいつも構造体にアクセスできます。これはCから継承されています。名前空間はC++の機能であり、動作が異なります。 –

0

プログラムが違法です。 enumは、 名前空間XX定数が同じスコープ内にある列挙の両方を別々のスコープ を(あなたがC++ 11 を使用していない限り、それにclassを追加)を導入しません。 オーバーレイされた関数と1つのクラス名が同じスコープ内で同じ名前を より1回以上定義できるケースは2つだけです。

struct stat { ... }; 
int stat(const char* path, struct stat* buf); 

壊れないでしょう: C APIのような機能を持つが、そのようクラス名の 特殊なケースでは、Cとの互換性のために純粋です。クラス名と別の名前の両方が存在する場合は、先にclassキーワードを付けない限り、 の他の名前が優先されます。

+0

C++ 11では、列挙子がスコープを持つために 'enum class'は必要ありません。彼らは常に(列挙名を持っていると仮定して)列挙名のスコープを持っています。しかし、後方互換性のために、それらは古いスコープを保持します。したがって、 'Y'と' Foo :: Y'はどちらもC++ 11では合法です。 –

関連する問題