Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;架构x86_64的重复符号..递增枚举类型_C++_Enums - Fatal编程技术网

C++ C++;架构x86_64的重复符号..递增枚举类型

C++ C++;架构x86_64的重复符号..递增枚举类型,c++,enums,C++,Enums,我正在尝试递增枚举类型,因此通过以下方式重载运算符+: enum QuarterType{ FIRST_QUARTER, SECOND_QUARTER, THIRD_QUARTER, FOURTH_QUARTER }; 重载运算符++: QuarterType& operator++(QuarterType& quarter){ switch (quarte

我正在尝试递增枚举类型,因此通过以下方式重载运算符+:

 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中有以下内容(-std=C++11选项用于clang编译器):

    enum类类型:int{
    第一季度=0,
    第二季度=1,
    第三季度=2,
    第四季度=3,
    总宿舍=4
    };
    内联四分之一类型和运算符++(四分之一类型和四分之一){
    int currentQuarter=静态_cast(季度);
    int nextQuarter=(当前季度+1)
    %静态铸型(四分之一型:总四分之一);
    季度=静态(下一季度);
    返回季度;
    }
    
    您的运算符++似乎是从多个编译单元导出的。这可能会导致重复的符号错误,其原因可能是头文件中运算符++的定义(而不仅仅是声明)。以下选项可用于解决此问题:

  • 将运算符++保留在头文件中,但将其声明为
    inline
  • 在头文件中只保留声明,并将定义移动到.cpp文件中
  • 在回答第二个问题(关于增加枚举类型的更好方法)时,我认为C++11中有以下内容(-std=C++11选项用于clang编译器):

    enum类类型:int{
    第一季度=0,
    第二季度=1,
    第三季度=2,
    第四季度=3,
    总宿舍=4
    };
    内联四分之一类型和运算符++(四分之一类型和四分之一){
    int currentQuarter=静态_cast(季度);
    int nextQuarter=(当前季度+1)
    %静态铸型(四分之一型:总四分之一);
    季度=静态(下一季度);
    返回季度;
    }
    
    。我猜你忘了保护头球什么的。请发布。如果将运算符++声明为内联,错误是否仍然存在?另外,为了实现,您可以使用枚举类和模运算。@SergeRogatch将运算符声明为内联解决了这个问题,但我不明白!你能解释一下吗?谢谢:)@Raw305,我已经添加了一个答案。。我猜你忘了保护头球什么的。请发布。如果将运算符++声明为内联,错误是否仍然存在?另外,为了实现,您可以使用枚举类和模运算。@SergeRogatch将运算符声明为内联解决了这个问题,但我不明白!你能解释一下吗?谢谢:)@Raw305,我已经添加了一个答案。我尝试使用你建议的方式,我遇到了一个“constness”问题和一个警告,上面写着“返回对本地临时对象的引用”。。你可能想看看我是怎么解决的,(我贴了一个答案)@Raw305,的确,我犯了一个错误。我已经更新了我的答案。你是对的,它没有正常工作(我修复它的方式)。。但是你的。。实际上我是一个初学者,所以我一直缺少一些简单的细节:(非常感谢:)我尝试使用你建议的方式,我遇到了一个“constness”问题和一个警告,说“返回对本地临时对象的引用”。。你可能想看看我是怎么解决的,(我贴了一个答案)@Raw305,的确,我犯了一个错误。我已经更新了我的答案。你是对的,它没有正常工作(我修复它的方式)。。但是你的。。实际上我是一个初学者,所以我一直缺少一些简单的细节:(非常感谢:)
    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;
    }