我一直在寻找有关使用的一些说明使用声明在头文件中(我正在四处搜索,但无法完全得到我正在寻找的答案)。到目前为止我的研究得出的结论是,将它们用于非全局的范围是好的,而命名空间指令则不好。我明白(至少我希望如此:))。
所以在我的例子中我使用shared_ptr
s,但我需要支持那些没有它们的旧编译器std::
命名空间但在std::tr1::
例如。由于每个班级都使用shared_ptr
需要同样的shared_ptr
定义,我必须输入正确的#include
每个头文件中的指令和 using 声明。因此,我将这部分移动到一个单独的头文件中,这样我就只有一个文件需要进行更改。关于哪个的决定shared_ptr
使用,是通过预处理器指令进行的HAS_SHAREDPOINTER
,如果用户有支持的编译器,则设置该值std::shared_ptr
.
共享指针.h:
#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_ */
现在,在每个使用shared_ptr的头文件中,我都包含这个头文件。例如在
模型Par.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
s)也有相应的使用声明在他的代码中。这是坏事,因为用户不知道这一点...等等。所以我将我的 using 声明放在全局范围内。或者?我对如何正确执行此操作感到困惑和困惑?提前致谢!
好吧,我自己找到了“the”答案。我想我不知道命名空间中的 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_ */
模型Par.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_ */
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)