我一直在寻找头文件中使用使用声明的一些说明(我在四处搜索,但无法完全得到我正在寻找的答案)。我的研究结论迄今为止,在非全局范围内使用它们是可以的,而命名空间指令是不好的。我明白(至少我希望如此:))。在头文件中使用声明
所以在我的例子中我使用了shared_ptr
s,但我需要支持在std::
命名空间中没有它们的旧编译器,例如std::tr1::
。由于每个使用shared_ptr
的类都需要相同的shared_ptr
定义,因此我必须在每个这些头文件中放入正确的#include
指令并使用声明。所以我将这部分移到了一个单独的头文件中,所以我只有一个文件需要进行更改。关于使用哪个shared_ptr
的决定是通过预处理器指令HAS_SHAREDPOINTER
进行的,如果用户具有支持std::shared_ptr
的编译器,则该设置被设置。
SharedPtr.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的每一个头文件,包括我这个头文件。例如,在
ModelPar.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)用户的方式也有相应的在他的代码中使用声明。这是坏事,因为用户没有意识到这一点......所以我把我的使用声明放在全局范围内。要么?我有点困惑和困惑如何正确地做到这一点?提前致谢!
也许是文体偏好的问题,但是......定义在namespace blub中使用条件'shared_ptr'的所有内容是没有必要的,也不太直观。并且认为在'struct's中声明类型别名是有利的(例如,用于模板),无法为定义重新打开它作为类型名称的快捷方式。所以,据我所知,更习惯的方法是使用包含它的'namespace'或'class'来限定别名的所有用法:'struct MyTypes {using shared_ptr = std :: shared_ptr; }; /*...*/ std :: set>' –