25

これよりも名前空間でクラスを定義するより簡潔な方法はありますか?

namespace ns { class A {}; }

私は何かclass ns::A {};がうまくいくことを望んでいましたが、残念ながらそうではありませんでした。

4

4 に答える 4

45

名前空間でクラスを前方宣言し、必要に応じて外部で定義できます。

namespace ns {
    class A; // just tell the compiler to expect a class def
}

class ns::A {
    // define here
};

できないことは、メンバーなしで名前空間でクラスを定義してから、名前空間の外でクラスを再度定義することです。これは、1 つの定義規則 (またはそのようなナンセンス) に違反しています。

于 2009-03-08T17:15:56.750 に答える
7

それはできますが、それほど簡潔ではありません。

namespace ns {
    class A;
}

class ns::A {
};

または

namespace ns {
    class B;
}

using ns::B;
class B {
};
于 2009-03-08T17:24:48.663 に答える
2

あなたが読むべきセクションはこれです:

7.3.1.2 名前空間メンバーの定義

3 名前空間で最初に宣言されたすべての名前は、その名前空間のメンバーです。[...]

-- 宣言という用語に注意してください。したがって、D.Shawley (および彼の例) は正しいものです。

于 2009-03-08T17:20:07.897 に答える
0

いいえ、できません。C++ 標準のセクション 3.3.5 を引用するには:

すべての名前付きまたは名前なしの名前空間 (7.3)、ブロック (6.3)、fun (8.3.5)、関数定義 (8.4)、およびクラス (節 9) の外側で宣言された名前には、グローバルな名前空間スコープがあります。

したがって、宣言は名前空間ブロック内にある必要があります - 定義はもちろんその外にあることができます。

于 2009-03-08T17:11:02.130 に答える