我一直在尋找頭文件中使用使用聲明的一些說明(我在四處搜索,但無法完全得到我正在尋找的答案)。我的研究結論迄今爲止,在非全局範圍內使用它們是可以的,而命名空間指令是不好的。我明白(至少我希望如此:))。在頭文件中使用聲明
所以在我的例子中我使用了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>' –