范围解析运算符被使用两次

时间:2017-11-30 13:50:34

标签: c++ class constructor namespaces name-lookup

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上遇到了这个函数定义。

我假设第二个和第三个“承诺”引用了类名和构造函数,但我无法弄清楚第一个的含义。我确信它没有引用命名空间,因为该名称不同。我已经看到范例解析运算符在示例中被使用了两次,但那些引用了嵌套的命名空间。

1 个答案:

答案 0 :(得分:14)

在C ++类中,具有将其名称注入其范围([class]/2)的功能:

  

class-name 也插入到类本身的范围内;   这被称为 inject-class-name 。出于访问目的   检查时,注入类名被视为公共   会员名称。

您展示的代码段会使用它。在某些情况下Commitment::Commitment命名类本身,在其他情况下命名c'tor。只有打开括号的最后一个Commitment(才会开始定义。

它可能看起来更糟糕:

struct foo {
    foo();
};

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

您可以看到有效的C ++ Live