草庐IT

c++ - 如何为 friend 函数中定义的类授予友元?

这个问题是不言自明的,但如果需要的话,这里有一个例子:假设我有一个带有私有(private)构造函数的类“Thing”,它是一个函数“make_thing”的friend:classThing{friendstd::shared_ptrmake_thing();Thing(){std::cout“make_thing”函数内部定义了一个结构:std::shared_ptrmake_thing(){//err:Thing::Thing()isprivatewithinmake_shared//autothing=std::make_shared();//thisisokaystructA

c++ - Cython 不能使用 operator()

当我尝试使用以下Cython代码时,我收到了我在最后发布的有关未定义operator()的错误。看来,当我尝试使用运算符时,Cython不会将其解释为成员函数(注意C++源代码中没有成员访问权限)。如果我尝试调用prng.operator()(),那么Cython将无法转换。在Cython中使用运算符重载是否需要一些特殊的东西?importnumpyasnpcimportnumpyasnpcdefexternfrom"ratchet.hpp"namespace"ratchet::detail":cdefcppclassRatchet:Ratchet()unsignedlongget64

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卡