【问题标题】:Simple I/O manipulator not working as intended简单的 I/O 操纵器未按预期工作
【发布时间】:2013-12-26 14:57:46
【问题描述】:

以下代码:

#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

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

【问题讨论】:

  • basic_ostream 具有函数指针的重载。您的函数的签名与其中任何一个都不匹配。

标签: c++ io


【解决方案1】:

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

你应该这样做:

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;

【讨论】:

    【解决方案2】:

    三个重载采用函数指针,可用于操纵器。三个签名是

    std::ios_base&                  (*)(std::ios_base&)
    std::basic_ios<cT, Traits>&     (*)(std::basic_ios<cT, Traits>&);
    std::basic_ostream<cT, Traits>& (*)(std::basic_ostream<cT, Traits>&);
    

    您使用的签名 (std::ios_base&amp;(*)(std::basic_ios&lt;cT, Traits&gt;&amp;)) 不是这些。

    我假设您使用实际设置作为示例,因为 std::scientific 操纵器已经实现了您的示例代码试图实现的逻辑。

    【讨论】:

    • 我预计会出现编译器错误。你知道为什么没有吗?
    • @jrok:指向函数的指针转换为bool,并且由于std::ios_base&amp;(*)(std::basic_ios&lt;cT, Traits&gt;&amp;)类型没有匹配的输出运算符,指向函数的指针转换为bool(实际上是true)为bool 有一个输出运算符。值true 打印为1(如果您想看到它打印为true,请使用std::boolalpha...)。
    • 啊,是的,我忽略了 1。谢谢。
    【解决方案3】:

    问题似乎是您的操纵器的签名。如果你把它改成

    std::basic_ostream<char> &my_manip (std::basic_ostream<char> &os)
    

    然后它会按照您的预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      相关资源
      最近更新 更多