我有一个模板特化的问题,归结为以下片段:#includestructClass{templatestaticvoidfun(doublea[N],double(&x)[N+1]);};templateinlinevoidClass::fun(doublea[1u],double(&x)[2u]){x[0]+=0.2;}templateinlinevoidClass::fun(doublea[2],double(&x)[3]){x[0]+=0.4;}intmain(void){doublex[1]={0};doublea[2]={0,1};doubleb[3]={0,0,1};Class
考虑这段代码:#includeusingnamespacestd;classWilma{public:staticinti;Wilma(){cout此处A行显式定义了Wilma类的staticinta。(注释掉导致链接器错误)没有它,链接器会给出undefinedreference错误。(因为实际上正在使用Wilma::i,如果我不使用它,则不会出现链接器错误。)对于Fred类的静态Wilmawilma_应该也是如此,即它也应该被显式定义......因为它也在B行的代码中使用。但事实并非如此,如果Fred::wilma_未明确定义,则不会出现链接器错误。为什么?在gcc4.5.2上测试
我有这个代码classIO{public:IO(LPC_GPIO_TypeDef*port,intpin):_pin(pin),_port(port){};constint_pin;LPC_GPIO_TypeDef*const_port;voidtest(){LPC_GPIO0->FIOSET=0;}};IOled1(LPC_GPIO0,5);intmain(){led1.test();return0;}当我编译它时,我得到了textdatabssdechexfilename65608664298lpc17xx我希望const_port和_pin变量存储在闪存中,因为它们被标记为con
当你动态分配了一个char*类型的缓冲区并想将它转换为特定类型时,你是否应该使用类似的东西reinterpret_cast(char*)或者类似的东西static_cast(static_cast(char*))为什么?我个人很想使用后者,因为对我来说,它并不是真正的数据“重新解释”(而只是一种分配缓冲区的机械方式)而且它看起来不像是一个来源错误的方式可能与典型的reinterpret_cast相同,但这是正确的直觉吗? 最佳答案 AccordingtoDaveAbrahams,使用链式static_casts是强制指针类型的正确、
来自对thisanswer的评论:类成员按照声明的顺序进行初始化。按照这个逻辑,下面的构造函数应该调用未定义的行为:structFoo{Bara;Barb;Foo(Barc):a(b=c){}};显然,我们在a初始化之前先分配给b。分配给未初始化的对象应该是UB。代码与Bar=int一起“工作”并不奇怪,但是如果我使Bar成为带有构造函数的重类,我会看到b确实在a之前初始化。(为了更疯狂,我们甚至可以说Foo(Barc,Bard):a(b=c),b(d){},仍然没有警告。)然而GCC4.6.1并未对此发出警告。这是可接受的、定义明确的行为,还是完全错误的?
使用gcc4.4.3版本如下:gcc-g-xc++-lstdc++-std=c++98-o./main./main.cppmain.cpp中的这段代码可以正常编译:#includestructA{A():m_flag(false){}constboolm_flag;};staticAaa=A();intmain(intargc,char*argv[]){Aa;//Notstatic=copyOKAb(a);Ac=b;Ad=A();//Static=copynotOK//aa=A();}但是如果我取消注释aa=A();我会得到:./main.cpp:Inmemberfunction'A&
先决条件:要理解这个问题,请先阅读以下问题及其答案:Castauto_ptrtoauto_ptr在Castauto_ptrtoauto_ptr史蒂夫回答说,“您的static_cast会将auto_ptr复制到一个临时文件,因此aS将被重置,当临时文件(在语句末尾)时,资源将被销毁。”我对static_cast时临时创建的过程很感兴趣叫做。我想要我可以跟踪的代码以查看此效果。我不能使用static_cast>...因为它不能被编译,所以我需要写一些模拟类而不是auto_ptr并观看临时创建的过程。我也明白临时创建与复制构造函数调用密切相关。auto_ptr的所有权丢失是通过设置_rad
做operator==有好处还是必须做,operator,operator>,operator,operator>>,!=,>=,...作为friend而不是类的方法?我还没有找到一篇很好的文字来解释为什么只交friend......我有一个很好的用例如果C1x;C2y;C3z;我有C3&operator+(C1&,C2&)作为C1和C2的friend,即当类(class)不同时,但问题是为什么是同一个类(class)。 最佳答案 独立函数的论据是这些运算符根据操作数类型应该是对称的。当您的类具有允许将左侧操作数隐式转换为您的类类型
对于C++类型,header为我们提供了许多有用的编译时反射功能。例如。std::is_base_of::value在编译时确定是否B是D的基类.我想知道是否可以按照类似的方式检测命名空间成员资格?例如。给定一个命名空间N类型T,有没有办法确定是否T包含在N中使用IS_NAMESPACE_MEMBER_OF(T,N)形式的宏表达式.我更喜欢通过任何类型的SFINAE/ADL类型的技巧获得编译时答案。或者,如果这是不可能的,那么标准不允许这样做的某种推理。一个不可移植的运行时hack是正则表达式typeid(T).name()对于N,但这相当乏味,而且不是在编译时。EDIT1:正如K-b
在我的main中,如何在Cpp中初始化这样的东西:Testingtest?classTesting{public:Testing();voidinitalize();~Testing();voidrun();private:intx;inty;intz;boolisBugged;OtherClassotherClass_;};顺序是什么? 最佳答案 首先调用类构造函数,并且可以使用初始化列表来参数化成员构造函数调用,否则在类构造函数入口点使用它们的默认构造函数。Class():otherClass_("fred",42){//cto