草庐IT

c++ - gcc 中变量模板的错误显式模板特化

//i.htemplateexternintconsti;//i.cpp#include"i.h"templateexternintconstexpri=42;//main.cpp#include"i.h"intmain(){returni;}在C++14/17模式下,这会用clang返回42,但是gcc会出错:“显式模板特化不能有存储类”。这是gcc中的错误吗? 最佳答案 整个问题有一个相当简单的解决方案。请另外查看this在ISOC++标准-讨论论坛上发帖以及RichardSmith的回复。1.extern不得在显式特化中指定所

c++ - is_lock_free() 在升级到 MacPorts gcc 7.3 后返回 false

以前,在AppleLLVM9.1.0中,128位结构上的is_lock_free()已返回true。为了获得完整的std::optional支持,我随后升级到MacPortsgcc7.3。在我第一次尝试编译时,我遇到了这个臭名昭著的showstopper链接器错误:Undefinedsymbolsforarchitecturex86_64:"___atomic_compare_exchange_16",referencedfrom:我知道我可能需要添加-latomic。使用AppleLLVM9.1.0,我不需要它,对此我有一种非常糟糕的预感。如果它是无锁的,你通常不需要链接到任何额外的

c++ - std::packaged_task 编译错误 w/gcc 4.6

我正在尝试使用std::packaged_task在线程中启动函数Queryquery;/*protobufobject*//*fillQueryobject*/std::packaged_tasktask([](Query&q)->SearchResults{index::core::Mergermerger;returnmerger.search(q);});std::futureftr=task.get_future();std::thread(std::move(task),query).detach();Edit2:再次更新代码以修复错误并包含完整的错误消息。g++-4.6(

c++ - gcc 与 visual studio 宏扩展

给定以下代码:voiddoSomething(intone,inttwo,intthree){//somethinghere}#defineONE1,2,3#defineTWO(arg)doSomething(arg);#defineTHREE(arg)TWO(arg)voiddoSomethingElse(){TWO(ONE)THREE(ONE)}visualstudio2010具有以下预处理器输出(省略一些空行):voiddoSomething(intone,inttwo,intthree){}voiddoSomethingElse(){doSomething(1,2,3);doS

c++ - 模板推导在 GCC 4.6 和 4.7 上的两个不同结果

考虑以下代码:#include#include#include#include//VersionAtemplatevoidf(constT&x){std::coutclassT>voidf(constT&x){std::coutclassT,TN...N>voidf(constT&x){std::cout());f(std::array());return0;}Windows上的GCC4.6.2提供:VersionAVersionBVersionCLinux上的GCC4.7.1提供:VersionAVersionBVersionA所以问题是:为什么?这是错误还是未定义的行为?我应该将其

c++ - 使用 gcc 编译更大的(~6MB)映射初始化 C++ 文件

我正在尝试编译一个大约5.7MB的C++文件。我正在64位Linux系统上构建64位Linux可执行文件。不幸的是,g++4.7.2不合作:g++:internalcompilererror:Killed(programcc1plus)通过top观察表明进程在此之前达到了大约2.2GB的内存。我尝试设置--paramgcc-min-expand=0并尝试使用--paramgcc-min-heapsize但这并没有解决问题。使用-O0禁用优化也无济于事。我也试过用clang编译,但结果是相似的。它在超过2GB的内存后发生了段错误。我没有尝试使用clang的任何额外选项,因为我对它不太熟悉

c++ - 使用gcc在C中链接C++静态库

在下面的代码中,我试图从C函数调用一个用C++编写的虚拟函数(使用C++头文件,如ap_fixed.h、ap_int.h)。当我用g++编译时,代码运行良好。但是当我使用gcc编译test.c时,它会抛出一个错误,因为我包含了一个有效错误的C++头文件。是否有使用gcc进行编译的解决方法?我从一些帖子中了解到,以这种方式合并C/C++代码并不是一个好的做法。如果使用大型C代码库和做类似的事情有任何严重的反作用,请赐教。谢谢头文件:testcplusplus.h#include"ap_fixed.h"#include"ap_int.h"#ifdef__cplusplusextern"C"

c++ - gcc 中的 Concepts-Lite(带有 TS 链接)

正如arecentanswer所强调的那样至thisquestion,gcc现在支持concepts-lite从它的svn主干构建。同样的问题链接到最近的TS,N4377.编辑-答案有更新的TS。可以在标有N3580的文章中找到有用的论文-这是2013年的文章,作者是AndrewSutton、BjarneStroustrup和GabrielDosReis。可以找到标有N4434的N4377调整列表。.这给出了对N4377论文的3个修改建议,并列为它的回复点WalterE.Brown。这些论文/技术规范相似,但在每种情况下都有各种小的变化。是否有一些简单的方法可以发现gcc当前实现了什么

c++ - 命名空间与包含的类同名,gcc 可以,clang 不行

考虑代码:templateclassFoo{};namespaceX{classX{};}usingnamespaceX;//nowbothclassXandnamespaceXarevisibleFoof(){return{};}intmain(){}gcc5.2编译代码没有任何错误。然而clang吐出错误:error:'X'isnotaclass,namespace,orenumerationFoof()error:referenceto'X'isambiguous根据C++标准,代码在语法上是否有效?或者只是一个gcc错误?删除限定名称X::X并使用Foo相反也让gcc窒息err

c++ - 为什么此代码无法使用 gcc 4.8.5 进行编译,而使用 clang 可以正常编译

#includeusingnamespacestd;intmain(){constintk=10;//Capturekbyvalueautomyl=[k](intk){cout下方错误lamda.cpp:Inlambdafunction:lamda.cpp:10:50:error:incrementofread-onlyvariableâkâautomyl=[k](intk){cout很明显我指的是局部变量K而不是常量成员K。 最佳答案 这并不像看起来那么简单。通过复制捕获k的lambda在很大程度上等同于一个结构对象,其闭包类型具