gpt4 book ai didi

file - 在头文件中使用声明

转载 作者:行者123 更新时间:2023-12-04 18:07:57 25 4
gpt4 key购买 nike

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

所以在我的示例中,我使用 shared_ptr s,但我需要支持在 std:: 中没有它们的旧编译器命名空间但在 std::tr1::例如。因为每个类(class)都使用 shared_ptr需要相同的 shared_ptr定义,我必须输入正确的 #include在每个头文件中使用指令和 using 声明。所以我将这部分移动到一个单独的头文件中,这样我只有一个文件需要进行更改。 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)的用户在他的代码中也有相应的 using 声明。这是一件坏事,因为用户不知道这一点......等等。所以我将我的使用声明放在全局范围内。或者?我对如何正确执行此操作感到困惑和困惑?提前致谢!

最佳答案

好的,我自己找到了“那个”答案。我想我不知道命名空间中的 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_ */

模型参数.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_ */

关于file - 在头文件中使用声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22201937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com