代码之家  ›  专栏  ›  技术社区  ›  Eloy user2871462

范围分辨率运算符被使用两次

  •  14
  • Eloy user2871462  · 技术社区  · 7 年前
    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 回复  |  直到 6 年前
        1
  •  16
  •   StoryTeller - Unslander Monica    7 年前

    在C++中,类具有将其名称注入其作用域的特性( [class]/2 ):

    这个 类名称 也被插入到类本身的范围中; 这被称为 注入的类名 . 出于访问目的 正在检查 注入的类名 被视为公众 成员名称。

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

    而且它可能看起来更糟糕:

    struct foo {
        foo();
    };
    
    foo::foo::foo::foo() = default;
    

    你可以看到它是有效的C++ Live .