2

名前空間を分割できるかどうか、または名前空間の定義を単一のブロックにする必要があるかどうか疑問に思っていました。私が何を意味するかを説明するには:

namespace test
{
    //declare a bunch of stuff here
    int a;
}

ここでは、クラスの宣言など、何か他のことを行います

class T
{
};

ここでは、上から名前空間を継続し、それを拡張します

namespace test
{
    //declare a bunch of additional stuff here
    int b;
    T val;
}

この例では名前空間testが 2 回使用されていますが、これはtest2 番目の定義によって拡張されているということですか? gcc でこのように使用すると、期待どおりに動作します。test::...単一の名前空間で定義されているかのように、すべての変数にアクセスできます。もちろんこれで規格化されているわけではないので、これで規格化されているかどうか知りたいです。

また、警告なども受けていないことに驚きました。しかし、これは、すでに使用されている名前を、知らないうちに誤って使用して拡張する可能性があることを意味しませんか?

4

2 に答える 2

3

あなたは確かにそれを行うことができます.C++ 11標準N3485セクション7.3.3.11に例が示されています

以下引用。

using 宣言によって宣言されたエンティティは、using 宣言の時点での定義に従って、それを使用するコンテキストで認識されるものとします。using-declaration の後に名前空間に追加された定義は、名前の使用時に考慮されません。

[ 例:

namespace A 
{ 
    void f(int); 
} 
using A::f; // f is a synonym for A::f; 
            // that is, for A::f(int). 
namespace A 
{ 
    void f(char); 
}

void foo() 
{ 
   f(’a’); // calls f(int), 
}         // even though f(char) exists.

void bar() 
{ 
    sing A::f; // f is a synonym for A::f; 
               // that is, for A::f(int) and A::f(char). 
    f(’a’); // calls f(char) 
}

—終わりの例]

于 2013-05-23T14:05:00.750 に答える
2

はい、名前空間の内容を複数のセクションに分割できます。

gccを使用-ansiしてコンパイルすると-pedantic、非標準コードの警告が表示されます。

これの典型的な使用例はもちろん、一連のものをヘッダー ファイルで宣言し、それらをソース ファイルで実装する場合です。

// header.h

namespace somename
{
   class A
   {
      // stuff goes here 
      void func();
      // more stuff. 
   }
 }

// source.cpp

#include "header.h"

namespace somename
{

   void A::func()
   {
      // whatever A::func() is supposed to do goes here. 
   }
}
于 2013-05-23T14:02:13.500 に答える