我有一个由第三方编写的类,它有这样的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
}
标头中函数名称之前的::
是什么意思?当我创建一个新对象时
Foo foo;
我无法访问这样的剂量测量功能:
foo.dosomething(1,2,3);
如何访问dosomething?当我在dosomething之前删除头文件中的::像这样:
class Foo
{
public:
int dosomething(float x, float y, float z);
//Other things here
};
我可以从Foo类型的对象访问dosomething。
将作用域添加到类定义中的函数名是不正确的(许多编译器认为这是一个错误)。由于它已经在一个类的范围内,所以您实际上是在将函数范围定义为Foo::Foo::dosomething
,这是错误的。
class Foo
{
public:
int Foo::dosomething(float x, float y, float z); // Shouldn't have Foo::
};
为了回答::
的作用,它指定了函数的作用域。考虑这两个函数
int dosomething(float x, float y, float z);
int Foo::dosomething(float x, float y, float z);
第一个是自由函数,后者是Foo
类的方法,并且(因为它前面没有单词static
)需要从中调用Foo
的实例。
通常,对现有类作用域使用::
作用域运算符引用其自己的成员(即使它是多余的)并不违法。
在类成员的声明点之后,可以在其班[注意:即使类是不完整的类,这也是真的。例如,
struct X {
enum E { z = 16 };
int b[X::z];
nbsp nbsp nbsp nbsp//OK};
C++11§3.3.2&段落;5
问题是,声明点的定义似乎排除了在成员声明中使用作用域运算符(如果它在自己的名称上)。
名称的声明点紧接在其完整声明符(第8条)之后,且在其初始值设定项(如果有)之前,除非以下说明。[示例:
int x = 12;
{ int x = x; }
这里,第二CCD_ 14是用它自己的(不确定的)值初始化的--结束示例]
C++11§3.3.2&段落;1
§后面的段落中,类成员没有例外;3.3.2
即使有上述限制,类成员的语法也不禁止对成员名称使用限定id。因此,接受所显示的代码不是语法错误。但是,存在语义冲突,应该发出诊断。