jjzjj

c++ - 模板参数名称与 MSVC C++ 中的方法发生冲突

以下代码片段无法在MSVCC++(2015、2017)中编译:templatestructBase:publicType{Base(constType&type):Type(type){}};structSomeType{intType(){return42;}};structWrong:publicBase{Wrong(constSomeType&type):Base(type){}};SomeTypesome;Wrongwrong(some);编译器感到困惑,并解释为调用Type构造函数调用我尝试从中派生的类的Type()方法。GNUC++编译器对代码没有问题。将基类声明中的模板参

c++ - MSVC++ 在除以 0 时出错,这永远不会发生!使固定?

constintbob=0;if(bob){intfred=6/bob;}你会在完成除法的那一行得到一个错误:“错误C2124:除以或模数为零”这是蹩脚的,因为“if”检查不可避免地会失败,因为除法会导致div为0。坦率地说,我认为编译器没有理由甚至评估'if',除了确保支撑完整性。无论如何,显然那个例子不是我的问题,我的问题是在编译时尝试做尽可能多的复杂模板内容,在某些情况下参数可能为0。有没有办法解决这个错误?或禁用它?或者比这更好的解决方法:目前我能想到的唯一解决方法(我之前遇到递归枚举访问的相同问题时已经做过)是使用模板特化来执行“if”。哦,是的,我正在使用带有vista/w

C++ - 是否值得在 Windows 上使用 GCC 而不是 MSVC?

关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭7年前。Improvethisquestion我已经阅读了一些关于GCC与MSVC以及这些编译器的开发的问题,例如GCCworthusingonWindowstoreplaceMSVC?,VisualStudioorGCC?和GCCvsMSC++compilerformaintainingAPIbackwardsbinarycompatibility.但这些都是非常过时的问题(2011年)。随着新的c++14特性的出现,两个编译器之间

c++ - GCC 默认导出所有符号与 MSVC 默认不导出任何内容之间的设计原理是什么?

C++编译器GCC和MSVC之间的许多关键区别之一是,首先默认导出共享库中的所有符号,而MSVC不导出任何内容。一些含义是,在MSVC中,您必须导出显式实例化的模板类。虽然我已经接受了这一事实,但我想知道从编译器设计人员的角度来看,每种方法的设计含义、权衡是什么? 最佳答案 这可能与各自操作系统中的可执行文件和库有关。在Windows上,库(DLL)和可执行文件是一回事。从字面上看,您可以将.dll重命名为.exe,它将运行保护模式stub并输出一些错误(再次强调,保护模式,因此它只能在16位系统上运行)。鉴于它们是相同的,并且您可

c++ - gcc 与 clang、msvc 和 icc : Is this function call ambiguous?

我能得到的所有编译器都同意这很好:templateautofoo(Check,T...)->void;templateautofoo(int,T...)->void;intmain(){foo(7,"");}但是,根据gcc,以下代码(带有不能从函数参数推导的前导模板参数)是不明确的:templateautobar(Check,T...)->void;templateautobar(int,T...)->void;intmain(){bar(7,"");//ambiguousaccordingtogccbar(7);//justfine}另一方面,clang、msvc和icc对此非常满

c++ - 缩小从 `int`(常量表达式)到 `unsigned int` 的转换 - MSVC vs gcc vs clang

constexprinti=100;structF{F(unsignedint){}};intmain(){F{i};}上面的代码片段:使用-Wall-Wextra-Wpedantic在g++7上编译没有警告。使用-Wall-Wextra-Wpedantic在clang++4上编译没有警告。无法在MSVC2017上编译:conversionfrom'constint'to'unsignedint'requiresanarrowingconversion问:这里MSVC是不是错了?liveexampleongodbolt.orginti=100;structF{F(unsignedint

c++ - 函数参数的 MSVC 和 constexpr?

这段代码用clang和gcc编译得很好。templatestructN{staticconstexprsize_tv=n;};templateconstexprbooloperator,size_tn2){returnnconstexprvoidfoo(Nv){static_assert(v{});return0;}但是,如果我使用MSVC,我得到的错误是v不是常量表达式。我能理解为什么MSVC这么认为,但我认为这是错误的,而clang/gcc是正确的。是MSVC的错误吗? 最佳答案 是的,MSVC在这里是错误的。代码格式良好似乎违

c++ - 在 C++ (MSVC) 中打印堆栈跟踪?

关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭7年前。Improvethisquestion在我的C++应用程序(使用VisualStudio2003开发)和Qt4,我想将特定代码行的堆栈跟踪打印到控制台输出或文件中。需要什么?Qt对此有帮助吗?

c++ - 为什么在 MSVC 中默认将浮点值(如 3.14)视为 double 值?

为什么我需要放置3.14f而不是3.14来禁用所有这些警告?这是否有连贯的原因? 最佳答案 这就是C++(和C)标准所决定的。浮点文字是double类型,如果你需要它们是float,你可以在它们后面加上一个f后缀。似乎没有任何具体说明原因,但我猜它是a)为了与C的兼容性,以及b)在精度和存储之间进行权衡。2.13.3FloatingliteralsThetypeofafloatingliteralisdoubleunlessexplicitlyspecifiedbyasuffix.ThesuffixesfandFspecifyfloa

c++ - MSVC 用 double 支撑初始化似乎违反了标准?

看看这个简单的程序:intmain(){floatf2=7.2;//OK,withwarningfloatf3=7.199999809265137;//OK,nowarningfloatf4{7.2};//Failsfloatf5{7.199999809265137};//OK,nowarningfloatf6={7.2};//Failsfloatf7={7.199999809265137};//OK,nowarning}当使用默认选项(cl/W4,版本19.00.23918)使用MSVC2015编译时,我收到以下消息:FloatTest.cpp(2):warningC4305:'in