-1

我尝试使用它,但遇到编译错误。不幸的是,我是编译器的新手,不理解该消息。我正在尝试取回默认的 &ostream 标志。有谁知道如何正确重置标志以及报告的错误是什么?

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    int v = 0xFF;
    cout << "0x" << hex << v << resetiosflags(hex) << v << endl;

    return 0;
}

汇编:

clang++ -Wall -std=c++11 -pedantic test251.cc && ./a.out
test251.cc:8:33: error: no matching function for call to 'resetiosflags'
    cout << "0x" << hex << v << resetiosflags(hex) << v << endl;
                                ^~~~~~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/iomanip:66:3: note: 
      candidate function not viable: no known conversion from
      'std::ios_base &(std::ios_base &)' to 'ios_base::fmtflags' (aka
      'std::_Ios_Fmtflags') for 1st argument
  resetiosflags(ios_base::fmtflags __mask)
  ^
1 error generated.
4

1 回答 1

2

关键部分是这样的:

candidate function not viable: no known conversion from
      'std::ios_base &(std::ios_base &)' to 'ios_base::fmtflags'

那是告诉你,它resetiosflags需要一个fmtflags实例,但你试图向它传递一个返回ios_base. 这有点令人困惑,但它std::hex是一个流操纵器,它实际上是一个函数,而std::ios_base::hex它是一个std::ios_base::fmtflags实例,这就是你需要传递给resetiosflags.

具体来说(未经测试)我认为这会做你想要的:

int main()
{
    int v = 0xFF;
    cout << "0x" << hex << v << resetiosflags(std::ios_base::hex)
        << v << endl;

    return 0;
}
于 2020-08-06T21:27:25.153 回答