包括(STL)标题中的标题文件

  • 本文关键字:标题 文件 STL 包括 c++
  • 更新时间 :
  • 英文 :


可能的重复:
重新包含实施中的标题

我想知道的是,不使用using namespace xxx在标题文件中以不污染全局名称空间是普遍的做法。#includes如何进行?

如果我有foo.hfoo.cpp。:

//Foo.h
#ifndef FOO_H_
#define FOO_H_
#include <string>
class Foo
{
  public:
    Foo(std::string * a, std::string * b);
    virtual ~Foo();
};
#endif /* FOO_H_ */
//Foo.cpp
#include <string>
#include <Foo.h>
Foo::Foo(std::string * a, std::string * b)
{
  // TODO Auto-generated constructor stub
}
Foo::~Foo()
{
  // TODO Auto-generated destructor stub
}

我真的需要在两个文件中 #include <string>吗?仅在.h或.cpp中包括它足够吗?(我知道两者都可以,但是建议什么?)


编辑,有关我的问题的更多背景信息。
如果我在标题文件中使用某些类(作为变量或方法参数),我会在标题文件中转发它们,而仅在源文件中包括标头文件本身。但这对大多数STL LIB都不起作用,因为您无法转发声明class-emplate?

...因为您无法转发声明班级 -

可以向前声明类模板 - 像非模板类:

// forward declaration
template <typename T>
class C;

但是,正如@AlexandRec在注释中所述的那样,对于std::string,这将非常复杂,因为std::string是从template <typename,typename,typename> basic_string;中键入的。

我写的话,如果允许的话,它将很复杂。而且不允许,请参阅:

  • http://www.gotw.ca/gotw/034.htm
  • https://stackoverflow.com/a/10290176/1463922

根据C 11标准,17.6.4.2.1:

C 程序的行为如果添加声明或 命名空间std或名称空间std中名称空间的定义 除非另有说明。

所以,别无选择,但在std::string的标题文件中包括<string>


对于您的主要问题 - 除非我很确定它将始终包含在标题文件中并且永远不会删除...

最新更新