jjzjj

c++ - 已删除的默认构造函数被标识为歧义错误中的候选者

当尝试删除默认构造函数并提供一个带有默认参数的新构造函数(因此仍然能够默认构造对象)时,我收到来自g++的歧义错误。classThing{public:Thing()=delete;Thing(intarg=0):arg(arg){}private:intarg;};intmain(int,char**){Thingthing;return0;}编译错误如下:$g++deletedConstructorTest.C-std=c++11deletedConstructorTest.C:Infunction"intmain(int,char**)":deletedConstructorTe

c++ - 是否允许复制/移动省略以使使用已删除函数的程序格式正确?

考虑以下代码:#includestructThing{Thing(void){std::cout我希望Thingthing{Thing{}};语句表示使用默认构造函数构造Thing类的临时对象并构造thingThing类的对象使用刚刚创建的临时对象作为参数的移动构造函数。我希望这个程序被认为是错误的,因为它包含对已删除移动构造函数的调用,即使它可能被省略。标准的class.copy.elision部分似乎也要求这样做:theselectedconstructormustbeaccessibleevenifthecalliselidedWordingforguaranteedcopyel

c++ - 我可以将函数的输出参数存储到 unique_ptr 中吗?

我有以下代码:classThing{};voidfnc(Thing**out){*out=newThing();};其中fnc通过输出参数返回Thing的新实例。通常我会按如下方式使用它:intmain(){Thing*thing;fnc(&thing);}我可以将返回的对象放在std::unique_ptr中吗?intmain(){std::unique_ptruniqueThing;fnc(???);} 最佳答案 要扩展您的代码示例,它(即传递指针)将是voidfnc(std::unique_ptr*out){out->rese

c++ - 使用模板减少 const 和非 const 非成员函数的代码重复

我有以下两个功能:Thing*find_thing_by_name(constString&name,Map&thing_map){autoit=thing_map.find(name);returnit->second;}constThing*find_thing_by_name(constString&name,constMap&thing_map){autoit=thing_map.find(name);returnit->second;}这只是我要解决的问题的一个简单示例。这些函数具有完全相同的主体,但我需要同时处理我的map的const和非const版本。我已经看到使用con

c++ - 在智能指针的双图中查找原始指针

我需要能够搜索原始指针Thing*在boost::bimap,int>.但是,我无法调用带有签名的函数bm.left.find(thingRawPtr)因为不能从原始指针隐式构造智能指针:bimap,int>bm;voidf(Thing*thing){bm.left.find(thing);//(Nasty)compileerror}规避这种情况的最佳方法是什么? 最佳答案 你必须创建一个智能指针,但你不能以常规方式进行,因为那样你将有两个单独创建的智能指针管理一个对象,当一个指针决定删除Thing,other指针留悬空指针。要解决

c++ - 如何初始化 std::array<std::array<T, 2>, 2> 的对象?

我正在尝试初始化thing类型的对象:templatestructthing:std::array,2>{};thingt1{{{1,2},{3,4}}};我得到:error:nomatchingfunctionforcallto‘thing::thing()’thingt1{{{1,2},{3,4}}};同上thingt0{{1,2,3,4}};还有其他一些东西。 最佳答案 如果您使用的是C++17编译器,您只是少了一组额外的大括号。以下compiles:thingt1{{{{1,2},{3,4}}}};//||||-braces

c++ - 不明确的模板实例化

有人可以解释这里的歧义吗?templatestructthing;templatestructthing{thing(int&,Rest&...){}};templatestructthing{thing(First&,Rest&...){}};intmain(){intmyint;charmychar;thingt(myint,mychar);} 最佳答案 如果你专注于int而不是int&它会起作用templatestructthing;templatestructthing{thing(int&,Rest&...){}};tem

c++ - OpenCL:是否可以使用模板化对象作为 Boost::compute 的内核参数?

我的内核函数签名如下:templatevoidkernel(constType1arg1,constType2arg2,Field*results){//Sisknownatcompiletime//Fieldmightbefloatordouble//Type1isanobjectholdingdataandalsomethods//Type2isanobjectholdingdataandalsomethods//Thecomputationstarthere}我知道可以使用c++特性的一个子集来使用extension编写内核到AMD的OpenCL实现,但生成的代码仅限于在AMD卡

c++ - 扩展 SWIG 内置类

SWIG的-builtin选项的优点是速度更快,并且不会出现多重继承的错误。挫折是我无法在生成的类或任何子类上设置任何属性:-我可以通过子类化来扩展像列表这样的python内置类型,没有麻烦:classThing(list):passThing.myattr='anything'#Noproblem-但是在SWIG内置类型上使用相同的方法,会发生以下情况:classThing(SWIGBuiltinClass):passThing.myattr='anything'AttributeError:typeobject'Thing'hasnoattribute'myattr'我该如何解决这

c++ - 更改现有对象 "on the fly"的 VTBL,动态子类化

考虑以下设置。基类:classThing{intf1;intf2;Thing(NO_INIT){}Thing(intn1=0,intn2=0):f1(n1),f2(n2){}virtual~Thing(){}virtualvoiddoAction1(){}virtualconstchar*type_name(){return"Thing";}}和派生类不同仅通过上述方法的实现:classSummator{Summator(NO_INIT):Thing(NO_INIT){}virtualvoiddoAction1()override{f1+=f2;}virtualconstchar*ty