読者です 読者をやめる 読者になる 読者になる

using指令

namespaceを使って、同じクラス名や同じ関数名や同じ変数名でも、別のものとして分けて認識できるようになった・・・。
しかし、そういったクラスや関数、変数がいくつも出てきた場合、いちいち名前空間を付けるのが面倒な場合がある・・・。
そういうときはusing指令(usingディレクティブ)を使って、そのスコープでは名前空間を可視できるようにする・・・。
つまり、そこでは名前空間を省略していいということ・・・。

test1.hが、

で、test1.cppが、

な場合に、

// ヘッダのインクルード
// 独自のヘッダ
#include "test1.h" // "test1.h"のクラスclass_test

// main関数の定義
int main(void){

  // オブジェクトの宣言
  class_test obj1; // class_testオブジェクトobj1

  // 出力
  obj1.print(); // obj1.printで出力.

  // プログラムの終了
  return 0;

}

としてコンパイルすると、

$ vi using_directive.cpp                     
$ g++ -o using_directive using_directive.cpp  test1.cpp
using_directive.cpp: 関数 ‘int main()’ 内:
using_directive.cpp:9:3: エラー: ‘class_test’ was not declared in this scope
   class_test obj1; // class_testオブジェクトobj1
   ^
using_directive.cpp:9:3: 備考: suggested alternative:
In file included from using_directive.cpp:3:0:
test1.h:5:7: 備考:   ‘test1::class_test’
 class class_test{
       ^
using_directive.cpp:9:14: エラー: expected ‘;’ before ‘obj1’
   class_test obj1; // class_testオブジェクトobj1
              ^
using_directive.cpp:12:3: エラー: ‘obj1’ was not declared in this scope
   obj1.print(); // obj1.printで出力.
   ^
$

となるので、名前空間を付ける・・・。

// ヘッダのインクルード
// 独自のヘッダ
#include "test1.h" // "test1.h"のクラスclass_test

// main関数の定義
int main(void){

  // オブジェクトの宣言
  test1::class_test obj1; // 名前空間test1のclass_testオブジェクトobj1

  // 出力
  obj1.print(); // obj1.printで出力.

  // プログラムの終了
  return 0;

}

これで、

$ vi using_directive.cpp                    
$ g++ -o using_directive using_directive.cpp  test1.cpp
$ ./using_directive
test1
$

通る・・・。これでもいいのだが、

このように、using指令でtest1名前空間自体を可視化すれば、"test1::"は省略できる・・・。
今回はブロックの外なので、どこでも省略可状態・・・。

$ vi using_directive.cpp                     
$ g++ -o using_directive using_directive.cpp  test1.cpp
$ ./using_directive                          
test1
$

これでも通った・・・。

Sample/cpp/using_directive/using_directive/src/using_directive at master · bg1bgst333/Sample · GitHub