私は変更しなければならないクラスのコードのこの行を見つけました:
::Configuration * tmpCo = m_configurationDB;//pointer to current db
二重コロンがクラス名の前に付いているのが正確には何なのかわかりません。それなしで、私は読むだろう:クラスtmpCo
...のオブジェクトへのポインタとしてのConfiguration
の宣言。
私も見つけました:
typedef ::config::set ConfigSet;
これにより、現在のネームスペースから開始するのではなく、グローバルネームスペースから解決が行われるようになります。たとえば、Configuration
という2つの異なるクラスがある場合は、次のようになります。
class Configuration; // class 1, in global namespace
namespace MyApp
{
class Configuration; // class 2, different from class 1
function blah()
{
// resolves to MyApp::Configuration, class 2
Configuration::doStuff(...)
// resolves to top-level Configuration, class 1
::Configuration::doStuff(...)
}
}
基本的に、それはあなたがあなたの名前が別の名前空間、この場合はMyApp
、の中の新しい定義によって壊されるかもしれないのでグローバルな名前空間まで横断することを可能にします。
::
演算子はスコープ解決演算子と呼ばれ、まさにそれを行い、スコープを解決します。そのため、type-nameの前にこれを付けることで、型のグローバル名前空間を調べるようにコンパイラに指示します。
例:
int count = 0;
int main(void) {
int count = 0;
::count = 1; // set global count to 1
count = 2; // set local count to 2
return 0;
}
::
はスコープ解決演算子です。何かの範囲を指定するのに使われます。
たとえば、::
だけが、他のすべてのネームスペース以外のグローバルスコープです。
some::thing
は、以下のいずれかの方法で解釈できます。
some
はnamespace(グローバルスコープ、または現在のスコープより外側のスコープ)で、thing
はtype、afunction、object、またはネストされたネームスペース;some
は現在のスコープで使用可能なclassで、thing
はメンバーオブジェクト、functionまたはsome
クラスの/ type。some
は現在の型のベース型になります(または現在の型自体) thing
はこのクラスのメンバーの1つです。atype、functionまたはobject。some::thing::bad
のように、スコープを入れ子にすることもできます。ここで、それぞれの名前は型、オブジェクト、または名前空間です。さらに、最後のbad
も関数になる可能性があります。関数はその内部スコープ内で何かを公開することはできないため、他のユーザーはできませんでした。
それで、あなたの例に戻って、::thing
はグローバルなスコープの中の何か、すなわち型、関数、オブジェクトあるいは名前空間でありえます。
あなたがそれを使用する方法は、それがグローバルスコープの型であることを示唆しています(ポインタ宣言で使用されています)。
私はこの答えがあなたがスコープ解決を理解するのを助けるのに十分で完全で正解であることを願っています。
::
は、何か(変数、関数、クラス、typedefなど)を名前空間またはクラスにリンクするために使用されます。
::
の前に左側がない場合は、グローバル名前空間を使用しているという事実を強調しています。
例えば。:
::doMyGlobalFunction();
そのスコープ解決演算子と呼ばれます。隠されたグローバル名は、スコープ解決演算子を使用して参照できます。
例えば;
int x;
void f2()
{
int x = 1; // hide global x
::x = 2; // assign to global x
x = 2; // assign to local x
// ...
}
(この答えは、OPが既に彼の問題を解決しているので、ほとんどグーグルのためのものです。)スコープ結果演算子というプレフィックス::
の意味は、他の答えでも説明されています。
その意味は「グローバル名前空間から名前を取る、他に何もしない」ということです。しかし、なぜこれを明示的につづる必要があるのでしょうか。
ユースケース - 名前空間の衝突
グローバル名前空間とローカル/ネストされた名前空間に同じ名前がある場合は、ローカルの名前空間が使用されます。グローバルなものが欲しいのであれば、それに::
を付けます。この事件は@Wyatt Andersonの答えで説明されています、彼の例を見てください。
ユースケース - 非メンバー関数を強調する
メンバー関数(メソッド)を書くとき、他のメンバー関数への呼び出しと非メンバー(フリー)関数への呼び出しは似ています:
class A {
void DoSomething() {
m_counter=0;
...
Twist(data);
...
Bend(data);
...
if(m_counter>0) exit(0);
}
int m_couner;
...
}
しかし、Twist
がクラスA
の姉妹メンバー関数で、Bend
がフリー関数であることが起こるかもしれません。つまり、Twist
はm_couner
を使用および変更できますが、Bend
は変更できません。 m_counter
を0のままにしたい場合は、Twist
をチェックする必要がありますが、Bend
をチェックする必要はありません。
これをより明確にするために、Twist
がメンバ関数であることを読者に示すためにthis->Twist
を書くか、Bend
が空いていることを示すために::Bend
を書くことができます。または両方。あなたがリファクタリングをしているか計画しているとき、これは非常に役に立ちます。
::
は名前空間を定義する演算子です。
例えば、あなたのコードの中でusing namespace std;
を言及せずにcoutを使いたいのであれば、これを書く:
std::cout << "test";
名前空間が言及されていない場合、そのクラスはグローバル名前空間に属していると言われます。
"::"はスコープ解決演算子を表します。同じ名前を持つ関数/メソッドは、2つの異なるクラスで定義できます。特定のクラススコープのメソッドにアクセスするには、解決演算子を使用します。