我想知道的是,在头文件中不使用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库来说,这是行不通的,因为你不能转发声明类模板?
发布于 2012-11-05 21:30:41
..。因为你不能转发声明类模板?
类模板可以转发声明的非模板类:
// forward declaration
template <typename T>
class C;但是,正如@AlexandreC在评论中指出的那样,对于std::string来说,这将是相当复杂的,因为std::string是来自template <typename,typename,typename> basic_string;的typedef。
我写它会很复杂,如果允许的话。这是不允许的,见:
根据C++11标准,17.6.4.2.1:
如果C++程序向名称空间std或命名空间std中的命名空间添加声明或定义,除非另有规定,则该程序的行为是未定义的。
因此,除了将<string>包含在std::string的头文件之外,别无选择。
对于您的主要问题-我将包括在源文件和头文件中,除非我非常确定它总是包含在头文件中,并且从未删除.
https://stackoverflow.com/questions/13240141
复制相似问题