2014-01-07 54 views
1

我正在通過Bjarne Stroustrup的C++編程語言進行工作,我被困在其中一個例子上。這裏是代碼,除了空格的差異和評論外,我的代碼與本書中的內容完全相同(第51頁)。無法在C++中定義++運算符,這裏有什麼問題?

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; 
} 

然而,當我與clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp編譯它在Mac OS X 10.9,我得到了以下錯誤:

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

真正baffeler是expected expression錯誤,但expected ;是有問題的爲好。我做了什麼?

+10

您試圖定義一個函數裏面的函數。你不能。 – 2014-01-07 16:19:56

+2

只需在主要功能外執行此操作... –

回答

9

Traffic_light & operator ++(Traffic_light & t)是一個名稱爲operator ++的函數。每個功能都應該在任何其他功能之外定義。因此在main之前放置運算符的定義。

+0

這就是問題所在。謝謝。我習慣於JavaScript這樣的語言,你可以把功能放在你想要的地方。只要StackOverflow允許,我會盡快接受答案。 (愚蠢的時間延遲) – Jonathan

0

你有幾個問題:

首先,你正試圖實現另一個功能(main)內的函數(operator++)。 C++不允許這樣做(除了lambdas)。

其次,你只實現了一個前綴增量,所以++light將工作,但light++不會。你應該實現它們。它的一個例子可以找到here

+0

C/C++允許在另一個函數內聲明一個函數。他們不允許定義一個函數。 –

+0

@弗拉格莫斯科啊,很好。讓我修正措辭。 –

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; 
}