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。因此,接受显示的代码不是语法错误。但是,存在语义违规,应该发出诊断。
我有一个由第 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 secondx
is initialized with its own (indeterminate) value. — end example ]
C++11 §3.3.2 ¶1
在 §3.3.2 的其余段落中,class 成员没有例外。
即使有上述限制,class 成员的语法也不禁止成员名称使用 qualified-id。因此,接受显示的代码不是语法错误。但是,存在语义违规,应该发出诊断。