在头文件中使用声明

时间:2014-03-05 15:24:41

标签: file header declaration using

我一直在寻找关于头文件中 using-declarations 的使用的一些说明(我正在四处寻找,但无法得到我正在寻找的答案)。到目前为止我的研究结论是,在非全局范围内使用它们是可以的,而命名空间指令是坏的。我明白了(至少我希望如此:)。)。

因此,在我的示例中,我使用shared_ptr,但我需要支持那些在std::命名空间中没有它们的旧编译器,例如std::tr1::。由于使用shared_ptr的每个类都需要相同的shared_ptr定义,因此我必须在每个头文件中使用正确的#include指令并使用声明。所以我将这部分移动到一个单独的头文件中,所以我只有一个文件,我需要进行更改。 shared_ptr使用HAS_SHAREDPOINTER的决定是通过预处理程序指令std::shared_ptr做出的,如果用户具有支持#ifndef SHAREDPTR_H_ #define SHAREDPTR_H_ #ifdef HAS_SHAREDPOINTER #include <memory> using std::shared_ptr; #else #include <tr1/memory> using std::tr1::shared_ptr; #endif #endif /* SHAREDPTR_H_ */ 的编译器,则会设置该指令。

SharedPtr.h

#ifndef MODELPAR_H_
#define MODELPAR_H_

#include <string>
#include <set>

#include "SharedPtr.h"

class ModelPar {
  private:
    std::set<shared_ptr<ModelPar> > connections;
  ...
};

#endif /* MODELPAR_H_ */

现在在每个使用shared_ptr的头文件中,我都包含了这个头文件。例如在

ModelPar.h

shared_ptr

现在我认为我这样做的方式是错误的,因为包含我的任何头文件的用户(使用{{1}} s)在他的代码中也有相应的使用声明 。这是坏事,因为用户不知道这......等等。所以我把我的使用声明放在全局范围内。要么?我对如何正确地做到这一点感到困惑和困惑?提前谢谢!

2 个答案:

答案 0 :(得分:1)

好的,我自己找到了“答案”。我想我不知道命名空间中的using声明在具有相同名称的以下命名空间范围内仍然有效。现在Bjarne的话更有意义,一个人不应该污染全局命名空间:)。如果我还在做错事,请纠正我。

<强> SharedPtr.h:

#ifndef SHAREDPTR_H_
#define SHAREDPTR_H_

#ifdef HAS_SHAREDPOINTER
#include <memory>
namespace blub {
using std::shared_ptr;
}
#else
#include <tr1/memory>
namespace blub {
using std::tr1::shared_ptr;
}
#endif

#endif /* SHAREDPTR_H_ */

<强> ModelPar.h:

#ifndef MODELPAR_H_
#define MODELPAR_H_

#include <string>
#include <set>

#include "SharedPtr.h"

namespace blub {

  class ModelPar {
  private:
    std::set<shared_ptr<ModelPar> > connections;
    ...
  };
}

#endif /* MODELPAR_H_ */

答案 1 :(得分:0)

我个人认为没有使用&#39;在任何标题上。的自从

它不仅使得重新分解起来非常困难,因为如果删除标题头包含链,编译器错误将变得无用。获得300多个遗漏声明错误,未定义类型等;并不完全是我对“欢乐时光”的定义。

当然,无论名称冲突如何,您都可以使用一些预处理器魔法来完成它。但为什么?如果您遇到命名空间碰撞,那么您的方法就会出现问题,绕过这种方式就像关闭火警并声称不再发生火灾一样好。

作为一个额外的奖励,它也模糊了你的班级的祖先a&#34;我是否在X命名空间中使用FooClass?或者它来自Y?&#34;。