用于体系结构 x86_64 的 C++ 重复符号..递增枚举类型

Raw*_*305 2 c++ enums

我正在尝试增加枚举类型,因此我以这种方式重载了运算符 ++:

 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)

我该如何解决这个问题?增加枚举类型的正确方法或更好的方法是什么?

Ser*_*tch 5

看来您的运算符++是从多个编译单元导出的。这可能会导致重复符号错误,其原因可能是头文件中运算符++的定义(而不仅仅是声明)。可以使用以下选项来解决该问题:

  1. 将运算符++保留在头文件中,但将其声明为inline
  2. 仅保留头文件中的声明并将定义移至 .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;
}
Run Code Online (Sandbox Code Playgroud)