2

次のコードを検討してください。

struct foo {
    typedef int bar;
};

namespace foo {
    class baz {
        /* code */
    };
}

これは私が取り組まなければならないコードベースに広がっており、時々うまくいくのですが、その方法がわかりません。

名前空間とクラスが同じソースで発生しない限り (前処理後)、機能します (その部分は理解しています)。ただし、突然名前空間とクラスの両方がプリプロセッサによって同じコンパイル単位にドラッグされると、衝突する (可能性がある) (ソースでこれが発生するかどうかはわかりません)。

コンパイラが常にコード構造を正しく解決できるようにする規則はありますか? 最も論理的なのは、名前空間とクラスが同じシンボルを持つことを禁止することです。適用されたコーディング スタイルでは、あいまいさはありますが、名前空間とクラスの衝突が許容されるため、コーディング規則を変更する代わりに、使用法をコンパイラに伝える方法をお勧めします。

何かのようなもの:

use_namespace(foo)::baz b; 
use_class(foo) b;
4

2 に答える 2

2

名前空間とクラスが同じソースで発生しない限り (前処理後)、機能します (その部分は理解しています)。

いいえ、そうではありません。2 つの異なるエンティティに同じ名前を宣言すると、C++11 3.3.1/4 に従って未定義の動作が発生します。

それぞれが同じ非修飾名を指定する単一の宣言領域内の宣言のセットを考えると、それらはすべて同じエンティティを参照するものとします

(クラスと名前空間に同じ名前を付けることを含まないいくつかの例外があります)。

宣言は別々の翻訳単位にあるため、多くのコンパイラはエラーを診断できず、動作しているように見える場合があります。

ただし、突然名前空間とクラスの両方がプリプロセッサによって同じコンパイル単位にドラッグされると、衝突する (可能性がある) (ソースでこれが発生するかどうかはわかりません)。

これらが同じ翻訳単位にあるため、エラーを診断できます。

于 2013-05-27T12:20:08.403 に答える