我正在研究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 ;
也有问题。我做了什么?
答案 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。