2017-11-30 4 views
6
namespace libzerocoin { 

//Commitment class 
Commitment::Commitment::Commitment(const IntegerGroupParams* p, 
           const Bignum& value): params(p), contents(value) { 
this->randomness = Bignum::randBignum(params->groupOrder); 
this->commitmentValue = (params->g.pow_mod(this->contents, params->modulus).mul_mod(
         params->h.pow_mod(this->randomness, params->modulus), params->modulus)); 
} 

ちょうどGitHubにこの関数の定義があります。スコープ解決演算子が2回使用されています

「コミットメント」の2番目と3番目がクラス名とコンストラクタを参照していると仮定しますが、最初のものの意味を理解できません。名前が異なるので、名前空間を参照していないと確信しています。私はスコープ解決演算子が例で2回使われているのを見ましたが、それらはネストした名前空間を参照しています。 C++クラスで

+1

偶数クラスB {B(); }; B :: B :: B(){}はgccとclangでコンパイルしますが、MSVCには問題があります。面白い。たぶん注入型。 –

答えて

5

は、それらの名前は、それらの範囲([class]/2)に注入有するという特徴を有する:

クラス名は、クラス自体の範囲に挿入されます。 これは、注入クラス名として知られています。アクセス のアクセスのために、注射クラス名は、公衆 のメンバー名であるかのように扱われます。

あなたが示したコードスニペットを利用しています。あるコンテキストでは、Commitment::Commitmentはクラス自体に名前を付け、他のクラスではそのクラスターに名前を付けます。かっこを開いた最後のCommitment(だけがc'torの定義を開始します。

そして、それははるかに悪い見ることができます:

struct foo { 
    foo(); 
}; 

foo::foo::foo::foo() = default; 

あなたが見ることができるC++ Live有効です。

関連する問題