2016-02-28 78 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); 

}