3
namespace A
{
   #include <iostream>
};

int main(){
 A::std::cout << "\nSample";
 return 0;
}
4

2 に答える 2

8

簡単な答え: いいえ。

長い答え: まあ、そうではありません。ただし、それを偽造することはできます。次のように、外部で宣言し、名前空間内で using ステートメントを使用できます。

#include <iostream>

namespace A
{
   using std::cout;
};

int main(){
 A::cout << "\nSample";
 system("PAUSE");
 return 0;
}

A でアクセスできたとしても、標準の名前空間ではアクセスできないため、ライブラリをローカライズすることはできません。

また、「もう 1 つの問題は、名前空間内の修飾名が A::std::cout になることですが、ライブラリには外側の名前空間で修飾された名前が含まれないことです。」ジョナサン・レフラーに感謝します。

すべてのコードで何ができるかを他の人に知られたくないという問題がある場合は、独自の cpp ファイルを作成して iostream を組み込み、そこで名前空間を定義することができます。次に、それをメイン(または何でも)に含めて、プログラマーにできることとできないことを知らせます。

于 2009-07-30T02:31:48.610 に答える
5

あなたは書くことができます:

#include <vector> // for additional sample
#include <iostream>
namespace A
{
  namespace std = std; // that's ok according to Standard C++ 7.3.2/3
};

// the following code works
int main(){
 A::std::cout << "\nSample"; // works fine !!!
 A::std::vector<int> ints;
 sort( ints.begin(), ints.end() );  // works also because of Koenig lookup

 std::cout << "\nSample";  // but this one works also
 return 0;
}

このアプローチは名前空間エイリアシングと呼ばれます。この機能の実際の目的は、次のサンプルに示されています。

namespace Company_with_very_long_name { /* ... */ }
namespace CWVLN = Company_with_very_long_name;

// another sample from real life
namespace fs = boost::filesystem;
void f()
{
  fs::create_directory( "foobar" );   // use alias for long namespace name
}
于 2009-07-30T04:48:49.480 に答える