请考虑以下代码:
{
std::string input = "FFFFFFF";
int result = 0;
auto itBeg = input.cbegin();
auto itEnd = input.cend();
if(!bsq::parse(itBeg, itEnd, bsq::int_parser<int, 16>(), result) || itBeg != itEnd)
{
throw std::exception();
}
std::cout << input << " means " << result << std::endl;
}
{
std::string input = "FFFFFFFF";
int result = 0;
auto itBeg = input.cbegin();
auto itEnd = input.cend();
if(!bsq::parse(itBeg, itEnd, bsq::hex, result) || itBeg != itEnd)
{
throw std::exception();
}
std::cout << input << " means " << result << std::endl;
}
{
std::string input = "FFFFFFFF";
int result = 0;
auto itBeg = input.cbegin();
auto itEnd = input.cend();
if(!bsq::parse(itBeg, itEnd, bsq::int_parser<int, 16>(), result) || itBeg != itEnd)
{
throw std::exception();
}
std::cout << input << " means " << result << std::endl;
}
第一个解析在0xFFFFFFF上正常工作(注意,7个十六进制数字)
第二个在0xFFFFFFFF上工作正常(8个十六进制数字)
第三个失败了,我不明白为什么。 isnt int_parser<T, 16>
与bsq :: hex基本相同?
住在Coliru
答案 0 :(得分:3)
第三个失败,我无法理解为什么
您正在使用已签名的解析器,并且会遇到类型宽度边界。将其更改为:
bsq::uint_parser<unsigned int, 16>(), result)
不是
int_parser<T, 16>
与bsq::hex
基本相同?
没有
The documentation说boost::spirit::qi::hex
将
使用 [..] radix 16解析无符号整数