2011-12-23 10 views
3

ヘッダーファイルにいくつかの関数を定義して、それらを同じヘッダーファイルで使用することはできますか?ヘッダーファイルのメンバでない関数を非表示にする

例えば、(データ構造に固有の)いくつかの一般的なヘルパー関数を定義してから、それらの関数を使用する同じヘッダーにいくつかのデータ構造を定義できますか?

例:

template<class T> 
void Swap(T &a, T &b) 
{ 
    T temp = a; 
    a = b; 
    b = temp; 
} 

しかし、私はSwap()が同じ名前を持つ他の機能に干渉したくありません。

伝統的に、名前空間detailsを実装するために使用されている私はそれプライベートメソッド作ることができますが、その後、私は同じ実装でそれを使用するすべてのクラスを提供したり、それらに友人のクラスを作る必要があるだろう...

+2

他のスワップ関数と干渉するスワップについては、それが名前空間が発明された理由です。私が知る限り、ヘッダファイル内の関数は、クラスや構造体の内部で非公開にすることによってのみ非表示にすることができます。あなたはこの関数だけをprivateとして構造体を作成し、あなたが作成したクラスをフレンドクラスとして指定することができます。 – leetNightshade

答えて

5

通常、関数を他のクライアントから完全に隠すことはできませんが、クライアントコードに干渉しないように、独自の名前空間に入れることができます。一般的なプラクティスは、ネームスペースをメインライブラリのネームスペースの内部名前空間にして、それをdetailsなどと呼ぶことです。

もちろん、ADLで利用できるようにする必要がある場合は、です。これは、ADLが一致すると思われるクラスを囲む名前空間に存在します。これを回避する方法はありません。

6

ヘッダーに入れなければならないものがあります。

また、std::swapがありますので、自分の必要はありません。

関連する問題