double-colon (::) 在 class 定义中的方法声明之前

double-colon (::) before method declaration in class definition

我有一个由第 3 方写的 class,里面有这样的东西 Foo.h:

class Foo
{
public:
    int Foo::dosomething(float x, float y, float z);

    //Other things here
};

而在 Foo.cpp 中,做的事情是:

int Foo::dosomething(float x, float y, float z)
{    
    //Something
}

header中函数名前的::是什么意思?当我创建一个新的 object

Foo foo;

我无法像这样访问 dosomething 函数:

foo.dosomething(1,2,3);

dosomething 是如何访问的?当我在执行以下操作之前删除 header 文件中的 :: 时:

class Foo
{
public:
    int dosomething(float x, float y, float z);

    //Other things here
};

我可以从 Foo 类型的 object 访问 dosomething。

在 class 定义的 中将范围添加到函数名称 是不正确的(许多编译器认为这是错误)。由于它已经在 class 的范围内,您实际上是将函数范围定义为 Foo::Foo::dosomething,这是错误的。

class Foo
{
public:
    int Foo::dosomething(float x, float y, float z);   // Shouldn't have Foo::
};

为了回答您关于 :: 的作用的问题,它指定了函数的 scope。考虑这两个函数

int dosomething(float x, float y, float z);
int Foo::dosomething(float x, float y, float z);

第一个是自由函数,后者是 Foo class 的一个方法并且(因为它前面没有单词 static)需要一个实例Foo 呼叫来源。

一般来说,使用 :: 作用域运算符对现有的 class 作用域引用它自己的成员并不是 非法的 (即使这是多余的)。

After the point of declaration of a class member, the member name can be looked up in the scope of its class. [ Note: this is true even if the class is an incomplete class. For example, struct X {
enum E { z = 16 };
int b[X::z];         // OK
};
C++11 §3.3.2 ¶5

问题是 声明点 的定义似乎排除了在成员声明中使用作用域运算符,如果它是在它自己的名称上的话。

The point of declaration for a name is immediately after its complete declarator (Clause 8) and before its initializer (if any), except as noted below. [ Example:
int x = 12;
{ int x = x; }
Here the second x is initialized with its own (indeterminate) value. — end example ]
C++11 §3.3.2 ¶1

在 §3.3.2 的其余段落中,class 成员没有例外。

即使有上述限制,class 成员的语法也不禁止成员名称使用 qualified-id。因此,接受显示的代码不是语法错误。但是,存在语义违规,应该发出诊断。