【发布时间】:2019-01-25 12:27:14
【问题描述】:
我创建了这段代码:
main.cpp
#include <iostream>
#include "Quote.h"
int main()
{
derived().print(std::cout);
getchar();
return 0;
}
报价.h
#pragma once
#include <string>
class base {
public:
std::string name() { return basename; }
virtual void print(std::ostream &os) { os << basename; }
private:
std::string basename = "abc";
};
class derived : public base {
public:
void print(std::ostream &os) { base::print(os); os << " " << i; }
private:
int i = 0;
};
如果我没有在 Main.cpp 中包含 iostream 头文件,如预期的那样,std::cout 将无法识别。我的问题是:如果 iostream 不包括在内,为什么在 Quote.h 中使用 std::ostream 没有问题? cout 和 ostream 都在上述库中定义,为什么 cout 的使用是一个问题而 ostream 不是?
我正在使用 VS 2017,以防此信息很重要。
【问题讨论】:
-
没有任何规则可以阻止其中一个标准标头包含另一个标头,因此有时会根据实施情况发生这种情况。
-
<string>可能包括<iostream>或<iosfwd>,反之亦然。 - 但你永远不应该依赖这个;始终明确包含您需要的所有标题。 -
@NeilButterworth:我希望它不包含
<iostream>:它不需要特定于该标题的任何内容!流定义可以从<istream>和<ostream>获取。 -
@Dietmar 好吧,我当然也希望如此。但它可以。
标签: c++ visual-studio header-files iostream