我的印象是C++中的所有内容都必须在使用前声明。事实上,我记得读过这就是为什么在返回类型中使用auto无效的原因如果没有类似decltype的C++0x:编译器必须在评估函数体之前知道声明的类型。当我注意到(经过很长时间)以下代码实际上完全合法时,想象一下我的惊讶:[编辑:更改示例。]classFoo{Foo(intx=y);staticconstinty=5;};所以现在我不明白:当编译器在其他地方需要前向声明时,为什么编译器不需要在类中进行前向声明? 最佳答案 标准说(第3.3.7节):Thepotentialscopeofan
我的印象是C++中的所有内容都必须在使用前声明。事实上,我记得读过这就是为什么在返回类型中使用auto无效的原因如果没有类似decltype的C++0x:编译器必须在评估函数体之前知道声明的类型。当我注意到(经过很长时间)以下代码实际上完全合法时,想象一下我的惊讶:[编辑:更改示例。]classFoo{Foo(intx=y);staticconstinty=5;};所以现在我不明白:当编译器在其他地方需要前向声明时,为什么编译器不需要在类中进行前向声明? 最佳答案 标准说(第3.3.7节):Thepotentialscopeofan
我创建了两个相同的类X和Y,并带有一个指向彼此的指针。请参阅下面的X.h代码,Y.h与所有交换的X和Y相同。但是,此代码在我的方法Connect中出现错误(错误C2027:使用未定义的类型“Y”)。在X.h中,我已经前向声明了类Y,但它不知道Y有一个名为SetXPointer的方法。因此我也需要转发声明这个方法,对吗?如果我尝试这样做(在行类Y;下添加行Y::SetXPointer(X*pX_in);),我会收到编译器错误C2761:'voidY::SetXPointer(X*)':不允许成员函数重新声明。有没有办法在X类中使用Y类的公共(public)方法?//X.h#pragmao
我创建了两个相同的类X和Y,并带有一个指向彼此的指针。请参阅下面的X.h代码,Y.h与所有交换的X和Y相同。但是,此代码在我的方法Connect中出现错误(错误C2027:使用未定义的类型“Y”)。在X.h中,我已经前向声明了类Y,但它不知道Y有一个名为SetXPointer的方法。因此我也需要转发声明这个方法,对吗?如果我尝试这样做(在行类Y;下添加行Y::SetXPointer(X*pX_in);),我会收到编译器错误C2761:'voidY::SetXPointer(X*)':不允许成员函数重新声明。有没有办法在X类中使用Y类的公共(public)方法?//X.h#pragmao
编译(gcc4.6.3,ubuntu)示例时看到此警告消息:struct{}a;intmain(){}warning:anonymoustypewithnolinkageusedtodeclarevariable‘a’withlinkage[enabledbydefault].GCC没有给出这个警告。只有G++可以。添加static清除警告:staticstruct{}a;我不明白它是什么意思,特别是为什么type与linkage相关。我认为链接取决于变量的声明位置和方式,而不取决于变量本身的类型。 最佳答案 这意味着变量a具有链接
编译(gcc4.6.3,ubuntu)示例时看到此警告消息:struct{}a;intmain(){}warning:anonymoustypewithnolinkageusedtodeclarevariable‘a’withlinkage[enabledbydefault].GCC没有给出这个警告。只有G++可以。添加static清除警告:staticstruct{}a;我不明白它是什么意思,特别是为什么type与linkage相关。我认为链接取决于变量的声明位置和方式,而不取决于变量本身的类型。 最佳答案 这意味着变量a具有链接
我有一个包含一些前向声明的头文件,但是当我在实现文件中包含头文件时,它会被包含在先前前向声明的包含之后,这会导致这样的错误。error:usingtypedef-name‘std::ifstream’after‘class’/usr/include/c++/4.2.1/iosfwd:145:error:‘std::ifstream’hasapreviousdeclaration.classifstream;classA{ifstream*inStream;}//EndofA.h#includeusingstd::ifstream;#include"A.h"//etc解决这个问题的标准是
我有一个包含一些前向声明的头文件,但是当我在实现文件中包含头文件时,它会被包含在先前前向声明的包含之后,这会导致这样的错误。error:usingtypedef-name‘std::ifstream’after‘class’/usr/include/c++/4.2.1/iosfwd:145:error:‘std::ifstream’hasapreviousdeclaration.classifstream;classA{ifstream*inStream;}//EndofA.h#includeusingstd::ifstream;#include"A.h"//etc解决这个问题的标准是
我在whentouseforwarddeclarationsoverincludingheaderfiles上看到很多解释,但他们中很少有人谈到为什么这样做很重要。我看到的一些原因包括:编译速度降低头文件管理的复杂性去除循环依赖来自.net背景,我发现标题管理令人沮丧。我有这种感觉,我需要掌握前向声明,但到目前为止,我一直在努力解决包含问题。为什么编译器不能为我工作并使用一种机制(包括)找出我的依赖关系?由于在某些时候需要编译引用的对象,前向声明如何加快编译速度?我可以接受降低复杂性的论点,但是一个实际的例子是什么? 最佳答案 “掌
我在whentouseforwarddeclarationsoverincludingheaderfiles上看到很多解释,但他们中很少有人谈到为什么这样做很重要。我看到的一些原因包括:编译速度降低头文件管理的复杂性去除循环依赖来自.net背景,我发现标题管理令人沮丧。我有这种感觉,我需要掌握前向声明,但到目前为止,我一直在努力解决包含问题。为什么编译器不能为我工作并使用一种机制(包括)找出我的依赖关系?由于在某些时候需要编译引用的对象,前向声明如何加快编译速度?我可以接受降低复杂性的论点,但是一个实际的例子是什么? 最佳答案 “掌