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 $
これでも通った・・・。