体系结构x86_64的C++重复符号递增枚举类型
C++ duplicate symbols for architecture x86_64..incrementing an enum type
我试图增加枚举类型,所以我以这种方式重载了运算符++:
enum QuarterType{
FIRST_QUARTER,
SECOND_QUARTER,
THIRD_QUARTER,
FOURTH_QUARTER
};
重载运算符++:
QuarterType& operator++(QuarterType& quarter){
switch (quarter) {
case FIRST_QUARTER:
return quarter= SECOND_QUARTER;
case SECOND_QUARTER:
return quarter=THIRD_QUARTER;
case THIRD_QUARTER:
return quarter=FOURTH_QUARTER;
case FOURTH_QUARTER:
return quarter=FIRST_QUARTER;
}
}
但当我编译项目时,我得到了错误:
duplicate symbol __ZN3mtmppERNS_11QuarterTypeE in:
/Users/../Library/Developer/Xcode/DerivedData/mtm-crtygivbbxwmodgeasndvnjnpczt/Build/Intermediates/mtm.build/Debug/mtm.build/Objects-normal/x86_64/SecurityExample.o
/Users/../Library/Developer/Xcode/DerivedData/mtm-crtygivbbxwmodgeasndvnjnpczt/Build/Intermediates/mtm.build/Debug/mtm.build/Objects-normal/x86_64/Quarters.o
duplicate symbol __ZN3mtmppERNS_11QuarterTypeE in:
/Users/../Library/Developer/Xcode/DerivedData/mtm-crtygivbbxwmodgeasndvnjnpczt/Build/Intermediates/mtm.build/Debug/mtm.build/Objects-normal/x86_64/SecurityExample.o
/Users/../Library/Developer/Xcode/DerivedData/mtm-crtygivbbxwmodgeasndvnjnpczt/Build/Intermediates/mtm.build/Debug/mtm.build/Objects-normal/x86_64/Security.o
ld: 2 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我该怎么修?增加枚举类型的正确方法或更好方法是什么?
您的运算符++似乎是从多个编译单元导出的。这可能会导致重复的符号错误,原因可能是头文件中运算符++的定义(而不仅仅是声明)。以下选项可用于解决问题:
- 在头文件中保留运算符++,但将其声明为
inline
- 只保留头文件中的声明,并将定义移动到.cpp文件中
在回答第二个问题(关于增加枚举类型的更好方法)时,我认为在C++11中如下(clang编译器的-std=C++11选项):
enum class QuarterType : int {
FIRST_QUARTER = 0,
SECOND_QUARTER = 1,
THIRD_QUARTER = 2,
FOURTH_QUARTER = 3,
TOTAL_QUARTERS = 4
};
inline QuarterType& operator++(QuarterType& quarter) {
int currentQuarter = static_cast<int>(quarter);
int nextQuarter = (currentQuarter+1)
% static_cast<int>(QuarterType::TOTAL_QUARTERS);
quarter = static_cast<QuarterType>(nextQuarter);
return quarter;
}
相关文章:
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- typedef 枚举和枚举类有什么区别?
- 为什么我的开关/机箱在使用枚举时默认?
- 在有符号基础类型枚举的位域上溢出
- 可以将枚举的默认类型设置为无符号字符
- C++11 在开关大小写中混合枚举类和无符号 int 将无法编译
- 枚举到无符号的整数
- integer常量太大,以至于在为枚举分配最大类型值时它是无符号的
- 使用枚举类的未定义符号
- 如果枚举不能装入无符号整型,会发生什么情况?
- 体系结构x86_64的C++重复符号递增枚举类型
- C++枚举是有符号还是无符号