web-dev-qa-db-ja.com

名前空間内でのクラスの定義

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

namespace ns { class A {}; }

class ns::A {};のようなものが機能することを望んでいましたが、残念ながらそうではありませんでした。

20
Iraimbilanja

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

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

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

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

35
D.Shawley

あなたはそれを行うことができますが、それは実際にはもっと簡潔ではありません。

namespace ns {
    class A;
}

class ns::A {
};

または

namespace ns {
    class B;
}

using ns::B;
class B {
};
7
Logan Capaldo

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

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

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

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

2
dirkgently

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

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

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

0
anon