C ++的双冒号在类名之后而不是名称空间中使用

zel*_*ell 2 c++ syntax

我试图理解这里列出的C ++程序。我对第86-87行中双冒号的第二次使用感到困惑:

 using TransformType = itk::AffineTransform< ScalarType, Dimension >;
 TransformType::Pointer transform = TransformType::New();
Run Code Online (Sandbox Code Playgroud)

看起来TransformType是用户定义的类型。以前如何使用它New()?我听说要在名称空间后使用双冒号,但是在这里,TransformType是类型(即类)而不是名称空间。有人可以澄清---是否应在C ++中的命名空间之后始终使用双冒号?是否可以使用点(例如Java)代替?

Lig*_*ica 5

您可以使用作用域解析运算符(::)在名称空间,类,作用域枚举中命名;这称为合格查找

#include <iostream>

namespace N
{
   int x = 0;
}

int main()
{
   std::cout << N::x << '\n';
}
Run Code Online (Sandbox Code Playgroud)

与类一起使用它通常意味着您要引用某个static成员,因为否则通常会使用它objectInstance.member

#include <iostream>

class C
{
public:
   static int x;
}

int C::x = 0;

int main()
{
   std::cout << C::x << '\n';
}
Run Code Online (Sandbox Code Playgroud)

不过,在非静态成员函数中,仍然有for的用法::,例如消除同时存在于不同基础中的名称之间的歧义。

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();
}
Run Code Online (Sandbox Code Playgroud)

…或用于static在不需要对象上下文的情况下命名非成员:

#include <iostream>

class C
{
public:
   int x;
}

int main()
{
    std::cout << sizeof(C::x) << '\n';

    decltype(C::x) y = 42;
}
Run Code Online (Sandbox Code Playgroud)

范围枚举是必需的,因为它们是范围限定的。这就是他们的重点。它们不会泄漏到周围的范围内,但是具有自己的范围,因此您需要特别指定。

enum class E
{
   Alpha,
   Bravo,
   Charlie
};

void foo(E value) {}

int main()
{
   foo(E::Alpha);
}
Run Code Online (Sandbox Code Playgroud)

某些语言允许您访问static类型名称后跟的类的成员.,就像您访问static对象名称后跟的类的非成员一样.。C ++不是这些语言之一。

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

#include <iostream>

class C
{
public:
   int x = 42;
};

int main()
{
   C obj;
   std::cout << obj.C::x << '\n';
//                  ^^^ what?!
}
Run Code Online (Sandbox Code Playgroud)

x无需在此处添加范围解析,因为该语言已经从中obj.得知您正在请求类的成员C。但是您仍然可以根据需要添加它。在这种情况下,通常只是“为您完成”。