【问题标题】:C++ operator << calling ::ostream instead of std::ostreamC++ 运算符 << 调用 ::ostream 而不是 std::ostream
【发布时间】:2018-03-31 15:09:30
【问题描述】:

我搜索了高低,但没有找到答案,所以如果这是重复的,请原谅。

我有一些非常古老的 C++ 代码,我正试图将它们轻松转换到这个千年。代码仍然在 Visual Studio 6 中编译,需要继续这样做,但我也试图让它在 Visual Studio 2017 中工作。我以前做过,但是对头文件等进行了很多更改,这次我是尝试更慎重的方法。

代码已经混合使用了 stl 和非 stl、新旧 io 标头等,所以等待爆炸的是一团糟。

作为一个简单的开始,我只是将 iostream.h 替换为 iostream 以查看会发生什么。我在代码中有 ::ostream 的地方遇到了一些编译器错误,因此将其更改为 std::ostream 解决了该问题。接下来我遇到了重载

我错过了什么?我假设我必须更改一些导入旧 io 类的更多头文件。

inline std::ostream& operator<<(std::ostream& os, const PrinterInfo& pi)
{
    os << pi.Idx() << ": " << pi.Name() << ", "
            << PrinterInfo::MapPrinterType(pi.GetPrinterType()) << ", "
            << PrinterInfo::MapPaperType(pi.GetPaperType()) << ", "
            << PrinterInfo::MapPrintFormat(pi.GetPrintFormat()) << ", "
            << PrinterInfo::MapRasType(pi.GetRasType()) << ", "
            << PrinterInfo::MapNPS(pi.NPS()) << ", "
            << "dpx = " << pi.Duplex() << ", "
            << "tray = " << pi.Tray2() << ", "
            << "port = " << pi.PortNo();

    return os;
}

PrinterInfo 类也覆盖了

    inline std::ostream& operator<<(std::ostream& os, const PrinterOption& po)
{
    os << "(" << po.Installed() << ", " << po.Enabled() << ")";
    return os;
}

【问题讨论】:

  • PrinterOptionPrinterInfo 是否在单独的命名空间中?
  • 是的,这段代码大部分是在 90 年代编写的,所以在一般的命名空间中,没有指定任何内容。
  • 那么,这段代码有什么问题呢?你期望什么结果,你观察到什么,两者有什么不同?您是否收到编译器错误、意外输出或其他问题?
  • 嗯,在我看来,函数中的
  • 显示错误消息的完整文本,以及PrinterInfo::Duplex() 的声明和operator&lt;&lt; 的声明,它们应该能够打印返回的任何内容。

标签: c++ io stl


【解决方案1】:

我不知道是不是这样,但是如果你在类头文件中实现一个函数的主体,删除 inline 关键字,我遇到了类似的问题,我浪费了 2-3 天和大量的重新编码来实现这……

【讨论】:

  • 我会试试看的。
  • 去看看。将这两个运算符移到 cpp 文件中并且它起作用了。谢谢!
  • 没错,这是一个包含错误,因为内联实际上是在复制调用发生的函数体,以避免多次调用小函数的开销。因此,链接器在逻辑上抱怨头文件的多个包含已在其他地方使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 2023-01-09
  • 2011-06-25
  • 2011-08-09
  • 2015-06-04
相关资源
最近更新 更多