2016-06-29 9 views
1

この質問が以前に要求されているかどうかは不明です。私は周りを探索して、私のシナリオのための正確な答えを見つけることができませんでしたが、私はそれを見逃しているかもしれません。(匿名)名前空間、関数、およびヘッダーファイル

問題は:私は名前空間の中で関数を定義したい、.cppファイルで

namespace Foo{ 
    void SomeFunc(); 
    void SomeOtherFunc(int); 
} 

:私は、ヘッダー・ファイル内の名前空間、およびヘッダでその名前空間内のいくつかの関数プロトタイプを持っていますまた、彼らはすべて匿名の名前空間に依存している乱数発生器にある程度の保護を提供する:

namespace Foo{ 

    namespace{ 
     RNG rando = new RNG(); 
    } 

    void SomeFunc(){ 
     //implementation 
    } 

    void SomeOtherFunc(){ 
     //implementation 
    } 
} 

私が午前の問題は、私が機能までのヘッダファイルの試合でプロトタイプという保証がないことですcppファイルで定義します。 namespace {}コードブロックのすべては、名前空間に新たに追加されたものである可能性があります。

上記のコード例では、SomeOtherFunc()はint型の引数なしで実装されていますが、宣言には何らかの引数が必要です。実際には、私はSomeOtherFunc()の署名をオーバーロードしているようです。

私はcppのファイルに次のように使用することもできます

namespace Foo{ 

    namespace{ 
     RNG rando = new RNG(); 
    } 

} 
void Foo::SomeFunc(){ 
    //implementation 
} 

void Foo::SomeOtherFunc(int){ 
    //implementation 
} 

コンパイラは、私が好きな機能宣言と実装との関係を強化するようです。しかし、関数は匿名の名前空間内のデータにアクセスできないように見えます。

ここに何か不足していますか?この実装に存在すると感じる問題を解決するために何かできることはありますか?私は(匿名の​​)名前空間の使用にあまり精通していないので、基本的な場合は謝罪します。

答えて

3
他の名前空間のうち、無名の名前空間を移動し

namespace{ 
    RNG rando = new RNG(); 
} 

void Foo::SomeFunc(){ 
    //implementation 
} 

void Foo::SomeOtherFunc(int){ 
    //implementation 
} 

それはとにかく翻訳単位外にアクセスすることはできません。

+0

すばらしい返信をいただきありがとうございます。私はそれがわかっていましたが、私は昨夜、気を取られて、チェックする機会を得られませんでした。だから私は仕事中の昼休み中にここで尋ねると思った。 – cottog

0

匿名の名前空間は、赤いニシンです。あなたはそれを無視することができます、の文字通り実装の詳細です。

はい、.cppファイルのヘッダーから関数をオーバーロードできます。ただし、定義されていない半分のペアを使用しようとすると、リンカーエラーが発生します。

2

通常の慣習は、匿名の名前空間を.cppファイルの先頭に宣言することです。あなたの場合、あなたのcppファイルはこのように見えます。

namespace{ 
    RNG rando = new RNG(); 
} 

void Foo::SomeFunc(){ 
    //implementation 
} 

void Foo::SomeOtherFunc(int){ 
    //implementation 
} 

このように、関数はrandoにアクセスする必要があります。

関連する問題