jjzjj

c++ - GCC 和 clang 中奇怪的构造和析构函数语法(void * 返回类型)

在编写一些C++代码(使用clang、x86_64linux进行编译)时,我不小心编写了以下结构:classClass{*Class(){}};即在构造函数名称前加上星号(*)。再尝试一下,我注意到您可以在前面放置任意数量的*;它也适用于析构函数,即classClass{********Class(){}********~Class(){}};Clang编译它没有任何错误或警告。但是GCC给出了警告controlreachesendofnon-voidfunction这让我相信我实际上是在声明一个返回类型为void*(或void********)的构造函数/析构函数。写任何类型的带有值

c++ - 如何编写用于从 C 访问 C++ 类成员的包装器(具有继承和构造函数)

在大多数问题中,我看到了一个没有构造函数、继承的简单类的包装器,只是调用了一个用于创建和销毁的void*以及一个foo函数。对于像下面这样的结构,应该如何创建一个包装器来从C代码访问类成员。myHeader.hforc++-------------------classchildA:publicparentA{private:voidlogger()override}classchildB:publicparentB{private:/*somemembers*/protected:/*somemembers*/public:explicitchildB(childA*a);}clas

c++ - 将函数传递给可变函数模板

考虑以下函数模板:templatevoidfoo0(std::functionf){}templatevoidfoo1(std::functionf){}以及以下函数:voidbar(intn){}为什么会出现以下情况:foo0(bar);//doesnotcompilefoo1(bar);//compilesfine编译错误是(gcc-8withC++17):error:nomatchingfunctionforcallto'foo0(void(&)(int))'foo0(bar);^note:candidate:'templatevoidfoo0(std::function)'vo

c++ - 在 C++ 中传递 void(*)

我有一个std::map,我试图为值存储空指针。问题是,我试图存储的大部分指针都是类中的方法并且具有不同数量的参数。我知道对于参数,我可以使用va列表,所以这不是什么大问题,问题在于实际指针本身。这是我的:classA{public:A();voidmethodA(...);};classB{public:B();voidmethodB(...);};voidmethod_no_class(...){}std::mapmy_map;my_map[0]=&method_no_class;B*cb=newB();my_map[1]=&cb->methodB;//willreturnerro

c++ - 是否有任何关键字可以在模板化派生类中重新定义模板化基类的 "all"方法?

我知道这看起来是个愚蠢的问题,但是在C++中使用带有模板的面向对象的东西真的很麻烦。例如,Foo是基类:templateclassFoo{public:virtualvoidMethod1(){}virtualvoidMethod1(inta){}virtualvoidMethod2(){}virtualvoidMethod2(inta){}//...lotsofothermethods};是否有类似的东西:templateclassBar:publicFoo{public:usingFoo::*;//redefineallinheritedmethodsfromFoovirtualv

c++ - 为什么 Qt 对 void* 使用 reinterpret_cast 而不是 static_cast?

您可以使用static_cast将任何指向T的指针转换为void*或将其转换为void*,为什么Qt使用reinterpret_cast?intSOME_OBJECT::qt_metacall(QMetaObject::Call_c,int_id,void**_a){_id=QMainWindow::qt_metacall(_c,_id,_a);if(_id(_a[1])));break;default:;}_id-=1;}return_id;} 最佳答案 老实说,我也一直没弄明白。void**结构的创建方式相同,只需将int*转换

c++ - 解决 Visual C++ 中缺少 vwscanf 的更好方法?

C++11标准规定vwscanf可通过标题获得(因此)。然而,它似乎缺乏在VisualC++中。有了这个功能,我可以写……inlineintscanf(CodingValueconst*format,...){va_listargs;va_start(args,format);return::vwscanf(format->ptr(),args);}但如果没有它,即使用VisualC++10.0,它似乎也缺乏对C++11可变参数模板的支持,我只能写……inlineintscanf(CodingValueconst*format,void*a01=0,void*a02=0,void*a0

c++ - 使用预制命名空间 (C++) 的范围

为了避免在STL中限定所有内容,您可以键入usingnamespacestd;为了避免只限定少数几件事,您可以输入:usingstd::cout;usingstd::cin;我想编写一个以相同方式运行的库。但是,我希望能够包含特定的函数集合,而不是能够包含特定的类。所以,例如,我编码:一组字符串函数一组数学函数它们是同一个命名空间的一部分,但我可以包含我想要的block这是类似sudo的代码,但我认为它传达了我的想法:namespaceEverything{namespaceStringFunctions{voidstr1(string&str);voidstr2(string&str

c++ - 如何确定调用堆栈结束?

所以我写了两个简单的类——X86StackFrame和X86CallStack:classX86StackFrame{public:X86StackFrame(void*frmAddr,void*retAddr);inlinevoid*GetFrameAddress()const{returnfrmAddr_;}inlinevoid*GetReturnAddress()const{returnretAddr_;}private:void*frmAddr_;void*retAddr_;};classX86CallStack{public:X86CallStack();inlinestd:

c++ - 将项目移动到 Visual Studio 2012

我刚刚转移到VisualStudio2012RC进行测试运行。但是我在让我的DirectX11游戏项目与它一起工作时遇到了问题。当我构建时,我收到1152条警告,它们看起来都像这样:1>e:\programfiles(x86)\microsoftdirectxsdk(june2010)\include\dwrite.h(4972):warningC4005:'DWRITE_E_NOFONT':macroredefinition1>c:\programfiles(x86)\windowskits\8.0\include\shared\winerror.h(50217):seeprevio