草庐IT

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++ - 编译器对带有元组参数的函数的混淆

我正在使用Apple的LLVM4.2编译器来编译此C++代码。我用不同的元组组合重载了一个成员函数,我相信我正确地调用了其中一个,但编译器发现了歧义。本质上,我试图调用下面的方法(1),但编译器发现方法(2)也可以接受/兼容。这是为什么?我打开了C++11标志。enumclassEnum1{...}enumclassEnum2{...}enumclassEnum3{...}enumclassEnum4{...}voidmyMethod(){Enum1e1;Enum2e2;Enum3e3;doSomething({e1,e2,e3});//shouldpick(1),yetcompile

C++11,枚举类,g++ 的 undefined reference ,与 clang++ 一起工作

我使用了新的C++11“枚举类”类型,并在使用g++时观察到“undefinedreference”问题。这个问题不会发生在clang++中。我不知道是我做错了什么还是g++错误。重现问题的代码是:(4个文件:enum.hpp、enum.cpp、main.cpp和Makefile)//file:enum.hppenumclassMyEnum{val_1,val_2};templatestructFoo{staticconstMyEnumvalue=MyEnum::val_1;};templatestructFoo{staticconstMyEnumvalue=MyEnum::val_2

c++ - MIDL 编译错误 : enum with "cy"

我有一个简单的IDL文件,它只包含一个enum。其中一个标识符是cy。[uuid(2642345F-F2AB-3600-8926-26E823800902),version(1.0),]libraryMyLib{typedef[uuid(a0b0aa7b-345f-4b3a-b88f-d6cdd048e205)]enumCodes{cy,abc}Codes;};但是,MIDL不会编译它并给我一个错误,如:MIDL2025:expectinganidentifiernear"cy"我的第一个猜测是cy是MIDL中的关键字/保留字——但事实并非如此。我的第二个猜测是cy已经在某处使用过或者

c++ - int * 和 enum * 之间如何转换?

从一些C遗留代码中,我得到了一些常量作为int*。在C++部分,我有一个底层类型int的枚举。在单值基础上枚举和int之间的转换有效。但是,int*和enum*之间的转换是不可能的。请参见下面的代码示例。这是为什么?我如何将指向某些int值的指针转换为指向int枚举的指针,反之亦然?我有点希望它能工作,因为单值转换工作并且基础类型是相同的。我读到了Whathappensifyoustatic_castinvalidvaluetoenumclass?但无法确定潜在的无效值是否在此处起作用。inti=3;enumE:int;Ee;e=static_cast(i);//oki=static_

c++ - 声明是否可以转义其封闭的 namespace ?

我正在尝试编写一个宏来帮助构建具有各种辅助函数的enumclass,例如用于转换为字符串。在某种集合中提供对枚举的所有值的访问是很自然的:DEFINE_ENUM(Foo,Value1,Value2);for(Foov:enum_traits::all_values){//...}这似乎可以通过使DEFINE_ENUM()宏专门化一个通用的enum_traits类来实现://globally:templatestructenum_traits{};//insidethemacro:#defineDEFINE_ENUM(Name,...)\/*define"enumclassName"..

c++ - Boost Enum 256 元素限制

我正在使用BoostVault中的枚举v4.6库(提到here[stackoverflow.com]),但遇到了256的元素限制(即每个枚举的最大元素数=256)。我知道这与boost预处理器库有关,一些调查使我找到了boost/preprocessor/config/limits.hpp,但更改这些值没有任何效果,因为它们纯粹是“信息”(link[groups.google.com])有什么办法可以增加这个限制吗? 最佳答案 遗憾的是,无法增加可与Boost预处理器库一起使用的元素/参数的上限。因此,由于枚举库依赖于Boost.P

c++ - 在 switch 语句中从 int 到 enum 类的隐式转换

enumclasspid{Alpha,Beta,Gamma};intmain(){intpropId=2;switch(propId){casepid::Alpha:casepid::Beta:casepid::Gamma:break;}}以上片段在msvc2012中编译良好(并且有效)但在clang-3.4和g++-4.8中失败。这些需要static_cast(propId)在switch子句中使用。顺便说一下,没有显式转换的简单赋值,例如pida=propId;在每个编译器中给出错误。谁做对了? 最佳答案 标准第4条,“标准转换

c++ - `enable_if` 与 `enum` 模板特化问题

我在GCC编译时遇到问题enable_ifs应用于模板类方法的返回值。使用Clang,我可以在enable_if中使用表达式在enum上模板参数,而GCC拒绝编译此代码。这里是问题描述、初始代码及其后续修改,试图让我和编译器满意(不幸的是,不是同时)。我有一个非模板类Logic包含模板化类方法computeThings()它有一个enumStrategy作为其模板参数的之一。computeThings()中的逻辑取决于编译时间Strategy,所以ifconstexpr是一种合理的实现方式。变体1#includeclassLogic{public:enumStrategy{strat_

c++ - doxygen:如何记录\enum 值外线?

准确地说:我知道如何在声明时对枚举进行dox,我想改为不在线地对它们进行dox。我想让头文件没有doxygen注释;它们都在.cpp文件中。这对函数、类、typedef等来说不是问题。我还可以像这样记录enum本身:/*!\enumMyClass::MyEnumFooBarBaz\valueFirstEnumValue但是我如何记录enum的值呢?谢谢! 最佳答案 您需要根据docs使用\var 关于c++-doxygen:如何记录\enum值外线?,我们在StackOverflow上找