C++ boost错误词法转换:将字符串转换为无符号长字符串时,无法将源类型值解释为目标

C++ boost错误词法转换:将字符串转换为无符号长字符串时,无法将源类型值解释为目标,c++,boost,lexical-cast,boost-lexicalcast,C++,Boost,Lexical Cast,Boost Lexicalcast,我编译的以下代码导致了以下错误。我不明白为什么我会出错 // This file is a "Hello, world!" in C++ language by GCC for wandbox. #include <iostream> #include <cstdlib> #include "boost/lexical_cast.hpp" typedef unsigned long long Ulonglong ; int main() { Ulongl

我编译的以下代码导致了以下错误。我不明白为什么我会出错

// This file is a "Hello, world!" in C++ language by GCC for wandbox.
#include <iostream>
#include <cstdlib>
#include "boost/lexical_cast.hpp"

typedef unsigned  long long Ulonglong ; 

int main()
{

    Ulonglong result   = boost::lexical_cast<unsigned long long>("862.00");
    return 0;
}
<代码> //此文件是GCC为Wangbox提供的“Hello World!”的C++语言。 #包括 #包括 #包括“boost/lexical_cast.hpp” typedef无符号long-long-Ulonglong; int main() { Ulonglong结果=boost::词法转换(“862.00”); 返回0; } 在函数“int main()”中启动prog.cc:prog.cc:11:15:警告: 未使用的变量“结果”[-Wunused variable]11 | Ulonglong 结果=boost::词法转换(“862.00”); |^~~~~~~在抛出“boost::wrapexcept”what()的实例后调用terminate: 错误的词法转换:无法将源类型值解释为目标 中止完成


似乎
boost::lexical_cast
必须执行精确的转换,并且没有扩展行为。您试图将包含小数点(因此包含小数部分)的数字的字符串表示形式转换为整数,这是不允许的


您应该首先将其转换为float/double(注意非常大的整数会丢失数据),然后再转换为整数,或者在将字符串转换为
boost::lexical_cast
之前将其小数部分切掉,这样看来
boost::lexical_cast
必须执行精确的转换,而不需要扩展行为。您试图将包含小数点(因此包含小数部分)的数字的字符串表示形式转换为整数,这是不允许的


您应该先将其转换为浮点/双精度(注意非常大的整数会丢失数据),然后再转换为整数,或者在将字符串转换为
boost::lexical_cast

862.00是一个浮点数,而不是整数。@vll所以lexical_cast不同于atol?我不能使用atol,因为一位评论员告诉我它不安全,并建议使用它。我们没有使用C++11,除非你的wandbox链接没有显示你的代码段。我猜词法转换确保了所有输入都在转换过程中被使用。事实并非如此。转换后,.00将保留在输入缓冲区中,这会导致错误。@gringo正确;atol忽略错误,包括这个错误。862.00是一个浮点数,而不是整数。@vll所以词法转换与atol不同?我不能使用atol,因为一位评论员告诉我它不安全,并建议使用它。我们没有使用C++11,除非你的wandbox链接没有显示你的代码段。我猜词法转换确保了所有输入都在转换过程中被使用。事实并非如此。转换后,.00将保留在输入缓冲区中,这会导致错误。@gringo正确;atol忽略错误,包括这一个。FWIW,
13
也是一个十进制数字-以10为基数表示的数字。问题出在小数点分隔符上。FWIW,
13
也是一个十进制数,以10为基数表示。问题出在小数点分隔符上。