名前空間 解答ページ | Programming Place Plus C++編【言語解説】 第3章

トップページC++編

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 と更新されており、今後も 3年ごとに更新されます。
なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。

問題①

問題① 次のプログラムの出力結果を答えてください。

#include <iostream>

void func();

void func()
{
    std::cout << "::func()" << std::endl;
}

namespace util {
    void func();

    void func()
    {
        std::cout << "util::func()" << std::endl;
    }
}

int main()
{
    using util::func;

    func();
}

using宣言によって、util::func関数は main関数のスコープ内に func という名前で追加されます。結果、「func();」という呼び出しは、その呼び出しと同じスコープ(main関数内) にある func関数を指したものであると判断されます。したがって、実行結果は次のようになります。

実行結果:

util::func()

問題②

問題② 問題①のプログラムで、main関数の内側にある using宣言を、

using namespace util;

に変更した場合、実行結果はどうなりますか?


usingディレクティブの場合、指定した名前空間名を修飾無しで使えるようになります。結果、

のいずれもが、「func();」で呼び出せることになります。やや勘違いしやすいところですが、グローバル名前空間と、他の名前空間とに、同じ名前でアクセスできる定義あったとき、どちらが優先されるということはなく、重複しており解決できないとみなされます。つまり、この問題の場合、コンパイルは失敗します。

もし、グローバル名前空間の func関数を呼びたかったのなら、

::func();

と書く必要がありますし、util::func関数を呼びたかったのなら、

util::func();

と書かなければなりません。


参考リンク


更新履歴

’2018/7/11 全体的に見直し修正。

’2013/3/28 新規作成。



第3章のメインページへ

C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る