重载运算符">>" bad_lexical_cast异常
bad_lexical_cast exception on overloaded operator ">>"
我为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之前检查空字符串。
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- EASTL矢量<向量<int>>连续的
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- C 字符串比较“祝您好运”&gt;“再见”
- Shared_ptr cast vs static_cast speed
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- C++错误,隐 <function-style-cast> 式要求使用模板化类一次调用多个构造函数的多个转换
- 如何修复<function-style-cast>错误:无法从'initializer list'转换为asdending比较<W>(模板函子)
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- C 操作员&gt;&gt;与突变器过载
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化