代码之家  ›  专栏  ›  技术社区  ›  zell

C++的双冒号,用于类名而不是命名空间之后

  •  0
  • zell  · 技术社区  · 5 年前

    我正在努力理解一个c++程序 here

     using TransformType = itk::AffineTransform< ScalarType, Dimension >;
     TransformType::Pointer transform = TransformType::New();
    

    看起来像 TransformType 是用户定义的类型。以前怎么用 New() ? 我听说双冒号要用在名称空间后面,但这里TransformType是一个类型(即类)而不是名称空间。是否有人澄清——在C++中的命名空间之后,是否应该使用双冒号?是否可以使用点(如Java中的点)?

    0 回复  |  直到 5 年前
        1
  •  6
  •   Lightness Races in Orbit    5 年前

    :: )在命名空间、类或作用域枚举中命名某物;这叫做 qualified lookup

    #include <iostream>
    
    namespace N
    {
       int x = 0;
    }
    
    int main()
    {
       std::cout << N::x << '\n';
    }
    

    static 成员,否则你通常会使用 objectInstance.member 相反。

    #include <iostream>
    
    class C
    {
    public:
       static int x;
    }
    
    int C::x = 0;
    
    int main()
    {
       std::cout << C::x << '\n';
    }
    

    :: ,例如消除同时存在于不同基中的名称之间的歧义。

    class Base
    {
    public:
       void foo() {}
    };
    
    class Derived : public Base
    {
    public:
       void foo()
       {
          // Do base version (omitting Base:: will just call this one again!)
          Base::foo();
    
          // Now maybe do other things too
       }
    };
    
    int main()
    {
       Derived obj;
       obj.foo();
    }
    

    …或者给一个- 静止的 不需要对象上下文的场景中的成员:

    #include <iostream>
    
    class C
    {
    public:
       int x;
    }
    
    int main()
    {
        std::cout << sizeof(C::x) << '\n';
    
        decltype(C::x) y = 42;
    }
    

    它是作用域枚举所必需的,因为它们是作用域的;这就是他们的重点。它们不会泄漏到周围的范围中,但有自己的范围,因此需要具体指定。

    enum class E
    {
       Alpha,
       Bravo,
       Charlie
    };
    
    void foo(E value) {}
    
    int main()
    {
       foo(E::Alpha);
    }
    

    静止的 类型名后跟 . ,就像你访问非- 静止的 对象名后跟

    顺便说一下,这是合法的:

    #include <iostream>
    
    class C
    {
    public:
       int x = 42;
    };
    
    int main()
    {
       C obj;
       std::cout << obj.C::x << '\n';
    //                  ^^^ what?!
    }
    

    将范围解析添加到 x obj. 你要找一个班级的成员 C