jjzjj

Declaration

全部标签

c++ - 变量名与函数名相同,给出编译器错误...为什么?

今天遇到一个有趣的问题,我想了解原因。考虑以下几点:classBase{public:Base(){}~Base(){}staticvoidfunction1(){}voidfunction2(){intfunction1;function1=0;function1();//我收到以下错误:expressionprecedingparenthesesofapparentcallmusthave(pointer-to-)functiontype我想我明白为什么会出现此错误:function1在function2()之外被自己调用时,实际上是指向function1()的函数指针。在func

c++ - 好友声明是真实的声明吗?

C++Primer说:Itisimportanttounderstandthatafrienddeclarationaffectsaccessbutisnotadeclarationinanordinarysense.所以友元声明应该只提供对友元类/函数的访问权限,它不是真正的声明。但是,我试过这个程序,它编译成功并在GCC5.2.0中输出2,有什么问题吗?#includeclassTmp{public:Tmp(inta):a_(a){};private:inta_;friendvoidp(Tmpa){std::cout 最佳答案

c++ - 声明和带有定义的声明。为什么不允许这样做?

我想知道,为什么不允许这样写:structfoo{voidbar();//declarationvoidbar(){std::cout该函数声明了两次(我认为这没问题)并定义了一次。但是,我的编译器提示:decldef.cxx:7:10:error:'voidfoo::bar()'cannotbeoverloaded为什么不允许?为什么我的编译器(g++4.7.2)将此解释为重载?PS:我知道如何写“正确的方式”,但我只是想知道,为什么上面是错误的。 最佳答案 来自§9.3Exceptformemberfunctiondefinit

c++ - 令人困惑的 C++ 全局范围问题

我正在参加C++练习测试,我对一组访问范围和声明点相关问题感到困惑。这两个问题都是相互关联的。我知道答案。我需要的是正确的解释:main结束时局部变量x的值是多少intx=5;intmain(intargc,char**argv){intx=x;return0;}回答:未定义main结束时y的值是多少?constintx=5;intmain(intargc,char**argv){intx[x];inty=sizeof(x)/sizeof(int);return0;}答案:5 最佳答案 来自标准:3.3.1[basic.scope.

c++ - 为什么声明为类成员的 const 变量仍然可以修改?

如果一个已经被赋值的const变量仍然可以被重新赋值,那么它不是一个const?举个例子:structss{constintm=1024;ss(){}ss(intm):m(m){}};sssa;sssb(-1);cout哇m毕竟不是常数!>/*Ouput:>>1024>-1>>*/ 最佳答案 ss(intm):m(m){}这表示当类ss被初始化时,它的成员m使用参数m被初始化。成员m确实不能修改,但可以初始化,就像任何其他const对象一样。请注意,如果我们改为这样做ss(intm){this->m=m;}那么我们就会遇到问题,因为

c++ - GCC 编译错误 : declaration of ‘strlen’ must be available

我的问题是,当我想制作一个下载的库时,我从GCC得到了一些奇怪的编译错误。编译器要求更正的代码似乎是正确的。报错都是这样的:Catalogue.h:96:error:therearenoargumentsto‘strlen’thatdependonatemplateparameter,soadeclarationof‘strlen’mustbeavailable这是第96行附近的代码:GaCatalogueEntry(constchar*name,T*data){if(name){_nameLength=(int)strlen(name);//LINE96//copyname_name

c++ - 将迭代器返回到 C 数组的方法的正确类型声明

我可以这样遍历C风格的数组:charfoo[3]={'a','b','c'};for(autoit=std::begin(foo);it!=std::end(foo);++it){*it='k';//valuesoffooarecorrectlymodified}现在假设我想将数组包装在一个类中,并公开返回相关迭代器的begin()和end()方法。我尝试了以下方法:templateclassStackMemPolicy{private:charmem[size];public:typedeftypenamestd::iteratoriter;iterbegin(){returnstd

c++ - 函数和声明局部变量

刚刚和工作中的同事讨论如何声明变量。对我来说,我已经决定了我喜欢哪种风格,但也许我错了。“C”风格-函数开头的所有变量。想知道变量的数据类型,看函数开头即可。boolFoo(){PARAM*pParam=NULL;boolrc;while(true){rc=GetParam(pParam);...dosomethingwithpParam}}“C++”风格-尽可能将变量声明为局部变量。boolFoo(){while(true){PARAM*pParam=NULL;boolrc=GetParam(pParam);...dosomethingwithpParam}}你喜欢什么?更新问题是关

c++ - 这个函数的参数在哪里?

void*(*proto_type(longint,char*b))(constchar*b,unsignedshortintd);返回类型是void*,proto_type是函数名?或者这是指向函数的指针?哪些是参数:(longint,char*b)或这个(constchar*b,unsignedshortintd)请解释一下这个函数是如何工作的。 最佳答案 void*(*proto_type(longint,char*b))(constchar*b,unsignedshortintd);这是一个函数声明。函数名为proto_ty

C++ 风格约定 : Parameter Names within Class Declaration

我是一个相当新的C++程序员,我想听听支持和反对在类声明中命名参数的争论。这是一个例子:Student.h#ifndefSTUDENT_H_#defineSTUDENT_H_#includeusingnamespacestd;classStudent{private:stringname;unsignedintage;floatheight,GPA;public:Student(string,unsignedint,float,float);voidsetAge(unsignedint);};#endif/*STUDENT_H_*/对比#ifndefSTUDENT_H_#defineS