.
C ++が使用する場所を使用しない::
理由は、これが言語の定義方法であるためです。::a
もっともらしい理由の1つは、以下に示す構文を使用してグローバル名前空間を参照することです。
int a = 10;
namespace M
{
int a = 20;
namespace N
{
int a = 30;
void f()
{
int x = a; //a refers to the name inside N, same as M::N::a
int y = M::a; //M::a refers to the name inside M
int z = ::a; //::a refers to the name in the global namespace
std::cout<< x <<","<< y <<","<< z <<std::endl; //30,20,10
}
}
}
オンラインデモ
Javaがこれをどのように解決するのかわかりません。Javaにグローバル名前空間があるかどうかさえわかりません。C#では、構文を使用してグローバル名を参照しますglobal::a
。これは、C#にも::
演算子があることを意味します。
しかし、とにかくこのような構文が合法であるような状況は考えられません。
a.b::c
のような構文は合法ではないと誰が言いましたか?
次のクラスを検討してください。
struct A
{
void f() { std::cout << "A::f()" << std::endl; }
};
struct B : A
{
void f(int) { std::cout << "B::f(int)" << std::endl; }
};
今これを見てください(ideone):
B b;
b.f(10); //ok
b.f(); //error - as the function is hidden
b.f()
関数が非表示になっているため、そのように呼び出すことはできません。GCCは次のエラーメッセージを表示します。
error: no matching function for call to ‘B::f()’
を呼び出すb.f()
(またはむしろA::f()
)には、スコープ解決演算子が必要です。
b.A::f(); //ok - explicitly selecting the hidden function using scope resolution
ideoneでのデモ