可能的重复:
重新包含实施中的标题
我想知道的是,不使用using namespace xxx
在标题文件中以不污染全局名称空间是普遍的做法。#includes
如何进行?
如果我有foo.h
和foo.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>
。
对于您的主要问题 - 除非我很确定它将始终包含在标题文件中并且永远不会删除...