c++ - 简单的 I/O 操纵器未按预期工作

标签 c++ io

以下代码:

#include <iostream>

std::ios_base &my_manip (std::basic_ios<char> &os) {
    os.unsetf(std::ios_base::basefield);
    os.setf(std::ios_base::scientific);
    return os;
}

int main (int argc, char **argv) {
    std::cout << 8.8888888 << std::endl;
    std::cout << my_manip << 8.8888888 << std::endl;
    return 0;
}

打印:

8.88889

18.88889

而下面的代码:

#include <iostream>

std::ios_base &my_manip (std::basic_ios<char> &os) {
    os.unsetf(std::ios_base::basefield);
    os.setf(std::ios_base::scientific);
    return os;
}

int main (int argc, char **argv) {
    std::cout << 8.8888888 << std::endl;
    my_manip(std::cout);
    std::cout << 8.8888888 << std::endl;
    return 0;
}

打印预期结果:

8.88889

8.888889e+00

谁能告诉我第一个版本有什么问题?

最佳答案

自定义操纵器签名不匹配,

你应该这样做:

std::ostream& my_manip (std::ostream &os) {
    os.unsetf(std::ios_base::basefield);
    os.setf(std::ios_base::scientific);
    return os;
}

std::cout << my_manip << 8.8888888 << std::endl;

关于c++ - 简单的 I/O 操纵器未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20786852/

相关文章:

C++ 多态性 : from parent class to child

c++ - 有没有办法使用静态断言和类型特征来防止类被派生两次?

java - 获取文件名区分大小写,拼写不区分大小写

c++ - 如何在纯 C/C++ (cout/printf) 中显示进度指示器?

java - 在java中使用数组作为switch case语句

java - 等待文件锁被释放

windows - Windows/Windows CE的串行I/O重叠/不重叠

c++ - 如何用我自己的模板函数包装 std::format() ?

c++ - 尝试使用外部库中的方法时出现读取/写入访问错误

c++ - 为什么 stringstream >> 在失败时更改目标值?