File 在头文件中使用声明

File 在头文件中使用声明,file,header,declaration,using,File,Header,Declaration,Using,我一直在寻找一些关于在头文件中使用声明的说明(我在四处搜索,但没有找到我想要的答案)。到目前为止,我的研究得出的结论是,在非全局范围内使用它们是可以的,而命名空间指令是不好的。我明白了(至少我希望如此) 因此,在我的示例中,我使用了shared\u ptrs,但我需要支持较旧的编译器,例如,这些编译器在std::命名空间中没有它们,但在std::tr1::中没有它们。由于使用shared\u ptr的每个类都需要相同的shared\u ptr定义,因此我必须在每个头文件中添加正确的#includ

我一直在寻找一些关于在头文件中使用声明的说明(我在四处搜索,但没有找到我想要的答案)。到目前为止,我的研究得出的结论是,在非全局范围内使用它们是可以的,而命名空间指令是不好的。我明白了(至少我希望如此)

因此,在我的示例中,我使用了
shared\u ptr
s,但我需要支持较旧的编译器,例如,这些编译器在
std::
命名空间中没有它们,但在
std::tr1::
中没有它们。由于使用
shared\u ptr
的每个类都需要相同的
shared\u ptr
定义,因此我必须在每个头文件中添加正确的
#include
指令并使用声明。所以我把这个部分移到了一个单独的头文件中,所以我只有一个文件需要修改。决定使用哪个
shared\u ptr
是通过预处理器指令
HAS\u SHAREDPOINTER
做出的,如果用户拥有支持
std::shared\u ptr
的编译器,则会设置该指令

共享dptr.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_ */
#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_ */
\ifndef SHAREDPTR\u H_
#定义SHAREDPTR_H_
#ifdef具有\u共享指针
#包括
使用std::shared_ptr;
#否则
#包括
使用std::tr1::shared\u ptr;
#恩迪夫
#endif/*SHAREDPTR_H_*/
现在,在每个使用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_ */
#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_ */
\ifndef MODELPAR\H_
#定义模型参数_
#包括
#包括
#包括“SharedPtr.h”
类模型参数{
私人:
std::设置连接;
...
};
#endif/*MODELPAR_H_*/
现在我认为我这样做是错误的,因为包含我的任何头文件(使用
shared_ptr
s)的用户的代码中也有相应的using声明。这是一件坏事,因为用户没有意识到这一点。。。所以我把using声明放在全局范围内。或我对如何正确地做这件事感到困惑和困惑?提前谢谢

好的,我自己找到了答案。我想我没有意识到名称空间中的using声明在以下名称空间作用域中仍然有效。现在,比亚恩的话也更有意义了,一个人不应该污染全局名称空间:)。如果我仍然做错了什么,请纠正我

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_ */
#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_ */
\ifndef SHAREDPTR\u H_
#定义SHAREDPTR_H_
#ifdef具有\u共享指针
#包括
名称空间blub{
使用std::shared_ptr;
}
#否则
#包括
名称空间blub{
使用std::tr1::shared\u ptr;
}
#恩迪夫
#endif/*SHAREDPTR_H_*/
ModelPar.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_ */
#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_ */
\ifndef MODELPAR\H_
#定义模型参数_
#包括
#包括
#包括“SharedPtr.h”
名称空间blub{
类模型参数{
私人:
std::设置连接;
...
};
}
#endif/*MODELPAR_H_*/

我个人认为在任何标题上使用“use”没有任何好处永远

这不仅使重新考虑因素变得非常困难,因为如果删除头包含链,编译器错误将变得无用。丢失声明、类型未定义等错误超过300个;这不完全是我对“娱乐时代”的定义

当然,您可以使用一些预处理器魔法来完成它,而不考虑名称冲突。但是为什么呢?如果您有名称空间冲突,那么您的方法就有问题,通过这种方式绕过它就像关闭火警警报一样好,并声称不再发生火灾


作为额外的奖励,它还掩盖了类a的起源,即“我是从X名称空间使用FooClass还是从Y使用FooClass?”

嗨,Manuel,嗯,我明白你的意思,我同意把它放在头文件中没有意义,而只是放在源文件中。通常我就是这么做的,但我怎么才能解决这个问题呢?不幸的是,我不能要求项目使用c++11,所以我必须调整…在标题中,您需要使用所使用类的完整声明。像
std::设置连接。看起来您需要的是一个单一的位置来管理您正在使用的实现;为此,您可以使用包装器包装共享指针,因此使用它看起来像
std::set connections可能是风格偏好的问题,但是。。。。在
名称空间blub
中定义任何使用您的条件
共享\u ptr
的内容都是不必要的,也不太直观。想想在
struct
s中声明类型别名(例如用于模板)的好处有多大,因为它不能作为类型名的快捷方式为定义重新打开。因此,据我所知,一种更惯用的方法是使用包含别名的
名称空间
限定别名的所有用法:
struct MyTypes{using shared_ptr=std::shared_ptr;};/*…*/std::set