2017-11-30 136 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)); 
} 

Po prostu napotkałem tę definicję funkcji na GitHub.Operator rozdzielczości zakresu używany dwukrotnie:

Zakładam, że drugie i trzecie "zobowiązanie" odnoszą się do nazwy klasy i konstruktora, ale nie mogę zrozumieć znaczenia pierwszego. Jestem pewien, że nie odnosi się do przestrzeni nazw, ponieważ ta nazwa jest inna. Widziałem operator rozdzielczości zakresu używane dwukrotnie w przykładach, ale te odnoszą się do zagnieżdżonych przestrzeni nazw.

+1

Nawet klasa B {B(); }; B :: B :: B :: B() {} kompiluje się z gcc i clang, ale MSVC ma problemy. Ciekawy. Może wstrzyknięty typ. –

Odpowiedz

5

W klas C++ są cechą mającą nazwę wstrzykuje się ich zakresu ([class]/2):

Klasa nazwajest również wkładany do zakresu samego rodzaju; Jest to znane jako nazwa klasy wtryskiwanej. W celu uzyskania dostępu do sprawdzania pod numerem , nazwa o nazwie w postaci wstrzykiwanej jest traktowana tak, jakby była publiczną nazwą użytkownika .

Ten fragment kodu, który pokazano, korzysta z niego. W niektórych kontekstach Commitment::Commitment nazywa samą klasę, aw innych nazywa ją c'tor. Tylko ostatni Commitment(, w którym otwierasz nawiasy, rozpoczyna definicję c'tor.

I może wyglądać o wiele gorzej:

struct foo { 
    foo(); 
}; 

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

które można zobaczyć jest ważny C++ Live.