草庐IT

c++ - 在显式实例化过程中什么时候可以使用不完整的类型?

我正在尝试制作一种自动创建包装对象的包装器类:#include#includetemplateclassFoo{std::unique_ptr_x;public:Foo();//willinitialize_x};此外,我希望能够隐藏T的实现细节来自Foo的用户(对于PIMPLpattern)。对于单翻译单元示例,假设我有structBar;//tobedefinedlaterexterntemplateclassFoo;//orjustimaginethecodeaftermain()isinaseparatetranslationunit...intmain(){Foof;//us

c++ - 隐式转换以适应现有构造函数

关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭4年前。Improvethisquestion我的主要目标是拥有类似的东西:std::chrono::high_resolution_clocktp4{2013,1,2,10,11,12,-1,1234};所以我创建了一个包含tm对象的类,如下所示:structTm:std::tm{inttm_usecs;//[0,999999]microsafterthesecTm(constintyear,constintmonth,constintmd

c++ - 如何显式调用好友流操作符?

这个问题在这里已经有了答案:IsADLtheonlywaytocallafriendinlinefunction?(3个答案)关闭4年前。考虑到这个片段,正如预期的那样,当调用流运算符而不指定命名空间时(通过像1一样调用流运算符),gcc无法找到在NA::operator#include#include#includenamespaceNA{classA{friendinlinestd::ostream&operator'}and'constNA::A')//2)//NB::operator我的问题是,如何明确调用NA::operator

c++ - 隐式转换产生 "error: taking address of temporary"(GCC vs clang)

在试验强类型整数时,我遇到了一个来自GCC8.2的奇怪错误:error:takingaddressoftemporary我可以想象上述错误有意义的典型场景,但在我的情况下我没有遇到问题。重现错误的缩小(人为)示例如下:#include#includeenumclassEnum:std::size_t{};structPod{std::size_tval;constexproperatorEnum()const{returnstatic_cast(val);}};templateconstexprvoidfoo(){usingFoo=std::integral_constant;//[G

c++ - 返回类型与自动的模板特化和显式规范

考虑代码:classTest{public:templateautofoo(){}templateautofoo(){return7;}templatevoidbar(){}templateintbar(){return7;}};我已经用不同的编译器测试了代码(通过CompilerExplorer)。如果Clang7.0.0foo编译,而bar给出错误::8:20:error:nofunctiontemplatematchesfunctiontemplatespecialization'bar'templateintbar(){return7;}^:7:26:note:candidat

c++ - C++中是否存在任何隐式内存障碍

在下面的代码中,是使用必要的原子来保证所有平台上的无竞争语义,还是使用promise.set_value/future.wait暗示某种隐式内存屏障,这将允许我依赖标志写入对外线程可见?std::atomic_boolflag{false};//voidrunInThreadPoolBlocking(Callablefunc){std::promiseprom;autofut=prom.get_future();enqueueToThreadPool([&](){func();prom.set_value();});fut.get();}一般来说,对于thread.join()或fut

c++ - 模板化时没有发生隐式转换

这里有几个相关但不同的类。一个包含float列表;一个只包含一个。有时我想,比如说,将它们相乘。在那种情况下,我想将非列表“提升”到列表中。这是代码,它按照我想要的方式工作。#defineLIST_SZ4classVec1;classVec1_list{public:Vec1_list(){}Vec1_list(constVec1&in);floatx[LIST_SZ];};classVec1{public:Vec1(){}Vec1(constfloat&in);floatx;};Vec1::Vec1(constfloat&in){x=in;}Vec1_list::Vec1_list(

c++ - 函数模板的显式实例化失败 (g++)

我在显式实例化函数模板时遇到了一些问题(即链接错误)。VisualStudio下项目链接正常,只有在g++/Unix下,使用Eclipse-CDT,链接出错。函数调用是一个静态库的一部分,在一个大项目中与动态库链接。该函数的架构如下:函数模板在我的MathUtils.h文件的命名空间内声明(但未实现)。其中一个函数参数本身就是一个结构模板,在这个h文件(在同一命名空间下)中声明并实现。函数实现和实例化在MathUtils.cpp中。函数调用在someFile.cpp(当然是#include"MathUtils.h")中,它作为静态库的一部分进行编译和链接。让我(几乎)发疯的是构建错误不

c++ - 在没有 RValue 隐式转换的情况下正确实现

我遇到了RValue不允许隐式转换的问题。我的问题是什么实现更好地“绕过”这个限制?下面是说明问题的示例代码:templateclassITestClass{public:virtualvoidmyFunc(myValitem)=0;virtualmyValmyFunc1()=0;};classCTestClass:publicITestClass{public:voidmyFunc(intitem){}intmyFunc1(){return0;}};templateinlineintCallFunction(std::shared_ptr>ptrBase){return0;}inli

c++ - Boost::HPC 侵入式

用于高性能计算的boost::intrusive库有多好?我想为不可复制的不可分配类使用一个容器。我打算用带有shared_ptr的普通STL。我发现boost::intrusive也可以用于相同的目的。所以我的问题是,它们真的那么有效吗?如果在具有shared_ptr类型的STL容器和boost::intrusive类型之间进行选择,您更喜欢哪一个? 最佳答案 一般来说,侵入式收集在内存使用方面是最有效的。如果您的目标是挤压每一个最后的CPU周期,那是唯一的方法。考虑一个boost共享指针列表。创建新对象时会发生以下情况:从堆中分