トップページ – Modern C++編 C++編](../../index.html) – 第4章
問題① 次のプログラムの出力結果を答えてください。
#include <iostream>
void func()
{
std::cout << "::func()" << std::endl;
}
namespace util {
void func()
{
std::cout << "util::func()" << std::endl;
}
}
int main()
{
using util::func;
();
func}
using宣言によって、util::func は main関数のスコープ内に func という名前で追加されます。結果、main関数内には、ローカルな func が存在することになります。
main関数内での func関数という呼び出しは、同じスコープ内にある func が選ばれますから、util::func関数の方が呼び出されます。このプログラムの場合、グローバル名前空間の func関数と同じ名前であることは問題ではなく、単に、より近いスコープのものが選択されるということです。
実行結果:
util::func()
問題② 問題①のプログラムで、main関数の内側にある using宣言を、
using namespace util;
に変更した場合、実行結果はどうなりますか?
usingディレクティブの場合、指定した名前空間名を修飾無しで使えるようになります。 結果、
のいずれもが、「func();」で呼び出せることになります。
問題①とは違って(using宣言とは違って)、util::func は util名前空間内にしかありません。つまり、名前空間が異なる2つの func が存在している状態です。しかもいずれも、main関数のスコープではないため、main関数内での「func()」という呼び出しは、どちらがより近いスコープであるとも言えず、判断ができないため、コンパイルは失敗します。
もし、グローバル名前空間の func関数を呼びたかったのなら、
::func();
と書く必要がありますし、util::func関数を呼びたかったのなら、
::func(); util
と書かなければなりません。
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |