Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类定义中方法声明前的双冒号(::)_C++_Oop_Msvc12 - Fatal编程技术网

C++ 类定义中方法声明前的双冒号(::)

C++ 类定义中方法声明前的双冒号(::),c++,oop,msvc12,C++,Oop,Msvc12,我有一个由第三方编写的类,它有如下Foo.h: class Foo { public: int Foo::dosomething(float x, float y, float z); //Other things here }; 在Foo.cpp中,dosomething是: int Foo::dosomething(float x, float y, float z) { //Something } 标题中函数名前面的:是什么意思?当我创建一个新对象时

我有一个由第三方编写的类,它有如下Foo.h:

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

    //Other things here
};
在Foo.cpp中,dosomething是:

int Foo::dosomething(float x, float y, float z)
{    
    //Something
}
标题中函数名前面的
是什么意思?当我创建一个新对象时

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

foo.dosomething(1,2,3);
dosomething是如何访问的?在执行类似操作之前删除头文件中的::时:

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

    //Other things here
};

我可以从一个FO类型的对象访问.< /p> ,将该范围添加到类定义中的函数名是不正确的(并且许多编译器认为这是一个错误)。因为它已经在一个类的范围内,所以本质上将函数范围定义为

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};

intb[X::z];
//确定
};

C++11第3.3.2条第5款

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

名称的声明点紧跟在其完整声明符(第8条)之后和初始值设定项(如有)之前,除非如下所述。[示例:
intx=12;

{int x=x;}

这里,第二个
x
用它自己的(不确定)值初始化。-结束示例]
C++11第3.3.2条第1款

在§3.3.2的其余部分的段落中,类别成员不存在例外情况


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

int Foo::dosomething(float x,float y,float z)中的
Foo
在类声明中,< /COD>是额外的和格式不正确的C++。(有些编译给出警告,其他忽略它)MSVC2013 32位(使用QT创建者IDE)