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

Tôi vừa gặp phải định nghĩa hàm này trên GitHub.Toán tử phân giải phạm vi đang được sử dụng hai lần

Tôi giả định rằng "Cam kết" thứ hai và thứ ba tham chiếu đến tên lớp và hàm tạo, nhưng tôi không thể hiểu ý nghĩa của tên đầu tiên. Tôi chắc chắn rằng nó không đề cập đến không gian tên vì tên đó khác nhau. Tôi đã thấy toán tử độ phân giải phạm vi được sử dụng hai lần trong các ví dụ, nhưng những tham chiếu đến các vùng tên lồng nhau.

+1

Thậm chí lớp B {B(); }; B :: B :: B :: B() {} biên dịch với gcc và clang nhưng MSVC có vấn đề. Hấp dẫn. Có thể tiêm loại. –

Trả lời

5

Trong lớp học C++ có các tính năng của việc có tên của họ tiêm vào phạm vi của họ ([class]/2):

Các class-name cũng được đưa vào phạm vi của lớp đó; điều này được gọi là tên lớp được tiêm. Để truy cập vào mục đích truy cập , tên lớp được tiêm được coi như là tên công khai .

Và đoạn mã bạn đã sử dụng sẽ sử dụng nó. Trong một số ngữ cảnh nhất định, Commitment::Commitment đặt tên cho chính lớp đó và trong các tên khác thì đặt tên là c'tor. Chỉ có Commitment( mới nhất, nơi bạn mở dấu ngoặc đơn, bắt đầu định nghĩa c'tor.

Và nó có thể tìm kiếm nhiều tồi tệ hơn nhiều:

struct foo { 
    foo(); 
}; 

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

nào bạn có thể thấy là hợp lệ Live C++.

Các vấn đề liên quan