2016-02-28 101 views
3

如在此代碼:超載<<上枚舉運營商提供了運行時錯誤

#include <iostream> 

enum class A { 
    a, 
    b 
}; 

std::ostream& operator<<(std::ostream& os, A val) 
{ 
     return os << val; 
} 


int main() { 
    auto a = A::a; 
    std::cout << a; 
    return 0; 
} 

當我沒有提供std::ostream& operator<<(std::ostream& os, A val)程序沒有編譯,因爲A ::一個沒有任何功能去<<。但是現在當我已經提供了它時,它會在我的終端中產生垃圾,並在ideone上產生運行時錯誤(超出時間限制)。

+1

'的static_cast (VAL)' –

+0

推薦花一些時間來學習你的開發環境的調試器。你會看到幾步之內發生了什麼問題,並節省了一些時間。除此之外,這是一個非常合適的問題。希望我們看到更多縮小到這個緊湊的MCVE。 – user4581301

回答

8
std::ostream& operator<<(std::ostream& os, A val) { 
    return os << val; 
} 

這將導致無限遞歸。請記住,在這種情況下,編譯器operator<<(os,val)確實看到了os << val。你想要做的是打印枚舉的基礎值。幸運的是,有一個type_trait允許您公開基礎類型的枚舉,然後您可以將參數轉換爲該類型並打印出來。

#include <iostream> 
#include <type_traits> 

enum class A { 
    a, b 
}; 

std::ostream& operator<<(std::ostream& os, A val) { 
    return os << static_cast<std::underlying_type<A>::type>(val); 
} 

int main() { 
    auto a = A::a; 
    std::cout << a; 
} 
+0

只需要問一個問題 - 這是純粹的編譯時方法還是一些運行時需要內省來確定基礎類型 –

+3

這是純粹的編譯時間。 – user4581301

5
std::ostream& operator<<(std::ostream& os, A val) 
{ 
    return os << val; // Calls the function again. 
        // Results in infinite recursion. 
} 

嘗試

std::ostream& operator<<(std::ostream& os, A val) 
{ 
    return os << static_cast<int>(val); 

}