C++';在类名后使用的双冒号,而不是命名空间 我试图理解一个C++程序。我对第86-87行第二次使用双冒号感到困惑: using TransformType = itk::AffineTransform< ScalarType, Dimension >; TransformType::Pointer transform = TransformType::New(); 使用TransformType=itk::仿射Transform; TransformType::Pointer transform=TransformType::New();

C++';在类名后使用的双冒号,而不是命名空间 我试图理解一个C++程序。我对第86-87行第二次使用双冒号感到困惑: using TransformType = itk::AffineTransform< ScalarType, Dimension >; TransformType::Pointer transform = TransformType::New(); 使用TransformType=itk::仿射Transform; TransformType::Pointer transform=TransformType::New();,c++,syntax,C++,Syntax,看起来TransformType是用户定义的类型。在New()之前如何使用它?我听说双冒号将在名称空间之后使用,但在这里,TransformType是一个类型(即类),而不是名称空间。是否有人澄清——在C++中的命名空间之后,是否应该使用双冒号?可以改用点(如Java中的点)吗?您可以使用作用域解析运算符(:)来命名命名空间、类或作用域枚举中的内容;这就是所谓的 尽管如此,在非静态成员函数中,仍然有:的用法,例如消除同时存在于不同基中的名称之间的歧义 class Base { public:

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

您可以使用作用域解析运算符(
)来命名命名空间、类或作用域枚举中的内容;这就是所谓的

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

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;
}
某些语言允许您访问类型名称后跟
的类的
静态成员,就像您访问对象名称后跟
的类的非
静态成员一样。C++不是其中的一种语言。
顺便说一下,这是合法的:

#include <iostream>

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

int main()
{
   C obj;
   std::cout << obj.C::x << '\n';
//                  ^^^ what?!
}
#包括
C类
{
公众:
int x=42;
};
int main()
{
C obj;

std::cout如果类
TransformType
具有静态成员函数
New()
,则可以使用
TransformType::New()调用它
::
是作用域解析运算符,它不限于名称空间。请参阅:运算符
是作用域运算符,用于表示作用域。因此
TransformType::New()
的意思是(基本上)“在
TransformType
的范围内调用函数
New
”@Someprogrammerdude谢谢。如果是这样的话,是否可以像在Java中一样使用“TransformType.New()”?我的意思是,使用点而不是两列?不,因为
TransformType
是一个类型名。您不能将其用作对象实例(因为它不是)java和C++使用不同的语法和语义。它们是相似的出现的语言,但是它们是非常不同的。它们都是好的、成功的语言,它们的字符和原则不同。自从你提到了代码> Obj.C::X< /C>,你可能还想提到<代码> siZeof(C:X)< /C>或<代码> DECKType(C::X)。
用于非静态
x
#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?!
}