【问题标题】:iostream required for inheriting from class template从类模板继承所需的 iostream
【发布时间】:2019-11-02 14:16:27
【问题描述】:

当从类模板(例如pair)派生类时,我们似乎需要包含iostream:

此代码有效:

#include <iostream>

class Vector: public std::pair<double,double> {
public:
    Vector() {}
    Vector(double a, double b): std::pair<double,double> (a,b) {}
};

int main
{
    return 0;
}

但如果我们省略 #include &lt;iostream&gt; 它甚至不会编译:

5 error: expected template-name before '<' token

这种继承需要iostream的什么特性?

【问题讨论】:

  • 我希望你包含 tuple 或 util 来获取 std::pair
  • std::pairutility 标头中。我猜iostream 也包括utility
  • 顺便说一句,不确定pair是否有虚拟析构函数,这种继承可能会给你带来麻烦
  • 您通常应该避免从这样的类中公开派生,而是使用组合。例如,该代码会通过允许外部代码修改 pair 数据成员(对实现的不希望的公共访问)来破坏封装。

标签: c++ class inheritance iostream


【解决方案1】:

这种继承需要iostream的什么特性?

没有功能。只是在您的系统上&lt;iostream&gt; 可能包含定义std::pair&lt;utility&gt; 标头。这意味着您可以传递包含正确的标头。允许标准标头相互包含作为实现细节,但这不是一个可以移植依赖的东西。

您应该放弃恰好起作用的错误标题,而选择正确的标题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-23
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多