首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在头文件中包括(STL)头文件

在头文件中包括(STL)头文件
EN

Stack Overflow用户
提问于 2012-11-05 20:49:29
回答 1查看 2.9K关注 0票数 3

可能重复: reincluding header in implementation

我想知道的是,在头文件中不使用using namespace xxx以避免污染全局命名空间是常见的做法。这怎么适用于#includes呢?

如果我有foo.hfoo.cpp

代码语言:javascript
复制
//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库来说,这是行不通的,因为你不能转发声明类模板?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-05 21:30:41

..。因为你不能转发声明类模板?

类模板可以转发声明的非模板类:

代码语言:javascript
复制
// 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的头文件之外,别无选择。

对于您的主要问题-我将包括在源文件和头文件中,除非我非常确定它总是包含在头文件中,并且从未删除.

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13240141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档