我正在尝试增加枚举类型,因此我以这种方式重载了运算符 ++:
enum QuarterType{
FIRST_QUARTER,
SECOND_QUARTER,
THIRD_QUARTER,
FOURTH_QUARTER
};
Run Code Online (Sandbox Code Playgroud)
重载运算符++:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我编译项目时出现错误:
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)
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?增加枚举类型的正确方法或更好的方法是什么?
看来您的运算符++是从多个编译单元导出的。这可能会导致重复符号错误,其原因可能是头文件中运算符++的定义(而不仅仅是声明)。可以使用以下选项来解决该问题:
inline回答第二个问题(关于增加枚举类型的更好方法),我认为 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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1261 次 |
| 最近记录: |