无法在C ++中定义++运算符,这里有什么问题?

时间:2014-01-07 16:16:26

标签: c++ c++11 enums switch-statement operator-overloading

我正在研究Bjarne Stroustrup的C ++编程语言,我坚持其中一个例子。这是代码,除了空格差异和注释之外,我的代码与书中的代码相同(第51页)。

enum class Traffic_light { green, yellow, red};
int main(int argc, const char * argv[])
{
    Traffic_light light = Traffic_light::red;
//    DEFINING OPERATORS FOR ENUM CLASSES
//    enum classes don't have all the operators, must define them manually.
    Traffic_light& operator++(Traffic_light& t) {
        switch (t) {
            case Traffic_light::green:
                return t = Traffic_light::yellow;
            case Traffic_light::yellow:
                return t = Traffic_light::red;
            case Traffic_light::red:
                return t = Traffic_light::green;
        }
    }

    return 0;
}

然而,当我在Mac OS X 10.9上使用clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp编译它时,我收到以下错误:

main.cpp:24:9: error: expected expression
        switch (t) {
        ^
main.cpp:32:6: error: expected ';' at end of declaration
    }
     ^
     ;

真正的baffeler是expected expression错误,但expected ;也有问题。我做了什么?

3 个答案:

答案 0 :(得分:9)

Traffic_light&安培; operator ++(Traffic_light& t)是一个名为operator ++的函数。每个功能都应在任何其他功能之外定义。因此,在main之前放置运算符的定义。

答案 1 :(得分:1)

您可以在这里运行代码:

http://coliru.stacked-crooked.com/a/74c0cbc5a8c48e47

#include <iostream>
#include <string>
#include <vector>

enum class Traffic_light { 
    green, 
    yellow, 
    red
};

Traffic_light & operator++(Traffic_light & t) {
    switch (t) {
        case Traffic_light::green:
            t = Traffic_light::yellow;
        break;
        case Traffic_light::yellow:
            t = Traffic_light::red;
        break;
        case Traffic_light::red:
            t = Traffic_light::green;
        break;
    }
    return t;
}

std::ostream& operator<<(std::ostream& os, Traffic_light & t)
{
    switch(t)
    {
        case Traffic_light::green:
            os << "green";
        break;
        case Traffic_light::yellow:
            os << "yellow";
        break;
        case Traffic_light::red:
            os << "red";
        break;
    }
    return os;

}

int main()
{
    Traffic_light light = Traffic_light::red;

    std::cout << "Ligth:" << ++light << std::endl;
    std::cout << "Ligth:" << ++light << std::endl;
    std::cout << "Ligth:" << ++light << std::endl;

    return 0;
}

答案 2 :(得分:0)

你有几个问题:

首先,您尝试在另一个函数(operator++)中实现函数(main)。 C ++不允许这样做(lambdas除外)。

其次,您只是实现了前缀增量,因此++light将起作用,但light++不会。你应该实现它们。可以找到它的一个示例here