重载运算符">>" bad_lexical_cast异常

bad_lexical_cast exception on overloaded operator ">>"

本文关键字:gt cast 异常 lexical 运算符 重载 bad      更新时间:2023-10-16

我为Enum重载了操作符">>:

#include <iostream>
#include <boost/lexical_cast.hpp>

using namespace std;
enum MyEnum
    {
        ONE = 0,
        TWO, 
        TREE,
        MAX
    };
const char* MyEnumString[MAX] =
{
    "ONE"
    ,"TWO"
    ,"THREE"
};
istream& operator>>(istream& is, MyEnum& myEnum)
{
    string value;
    is >> value;
    myEnum = ONE;
    for (int i=0; i < MAX; i++)
    {
        if (!value.compare(MyEnumString[i]))
        {
            myEnum = static_cast<MyEnum>(i);
            return is;
        }
    }
    return is;
}
int main()
{
   cout << "Hello World" << endl; 
   boost::lexical_cast<MyEnum>(""); //Throws exception. 
   return 0;
}

我得到的输出:

Hello World的实例抛出后调用终止boost:: exception_detail:: clone_impl

' what():坏的词法强制转换:源类型值不能解释为目标

抛出lexical_cast_39.hpp (1155):

if (interpreter >> result)

操作符对除空字符串外的所有值都有效。从操作符返回的输入流与开始时的输入流是相同的。

对于这样的问题,可以接受的方法是什么?谢谢!

问题是您告诉lexical_cast将空字符串转换为MyEnum。你希望它做什么?它不能返回一个真实的值,所以一个异常是正确的。

更详细的分解:lexical_cast接受输入空字符串,并从该值创建输入流。然后传递给您的operator>>。当您执行is >> value;时,它将在流上设置eof标志(因为它试图读取字符串,并且没有剩余数据)。

函数返回后,它完成if ( interpreter >> result ),这基本上检查流是否仍处于良好状态。因为它不是(由于之前的eof位),它失败并产生一个异常。

如果你想要一个空字符串被解释为一个特定的值,你必须在返回之前清除流中的错误标志。就我个人而言,我不会这样做,因为这会限制输入操作符在其他情况下的有用性。如果我需要这个功能,我很可能在调用lexical_cast之前检查空字符串。