2011-06-29 24 views
2

これは本当に簡単ですが、私は期待していないエラーが発生しています。グローバルな名前空間から何かを参照していますか?

私は、次の名前空間の内部で

あるいくつかのコードを持っているが、私のコードの構造を表し、いくつかの擬似コードです:

namespace A { 
    void init() { 
     initialize_kitchen_sink(); 
    } 
    #include "operations.h" // declares shake_and_bake() 
    void foo() {    
     shake_and_bake(); 
    } 
    void cleanup() { 
     // do nothin' cuz i'm a slob 
    } 
} 

はエラー:

undefined reference to `A::shake_and_bake` 
+2

operations.hファイル内のすべてが名前空間Aで宣言されています。ファイルoperations.hを別のファイルに含めるが、異なる名前空間(グローバルなど)に入れると、これらは全く異なる宣言になります。 #includeはプリプロセッサの一部であり、言語構造が完成するずっと前から動作していることに注意してください。 –

答えて

6

が動い判明します名前空間の外側の#includeがそれを修正します。

これはそのままで、A名前空間内のoperations.hのすべての関数をインクルードで宣言することになります。その後、実装について無駄に検索します。

投稿全体を削除するのではなく、他の人が同様の問題に遭遇して啓発される可能性があるその分だけ残しておくことができます。

+0

さらに、まだ最初にロジックが必要な中間ではなく、ソースファイルの先頭にインクルードしてください。 –

+0

先頭にインクルードしないようにする理由がありません。私はまだ時々これを混乱させるでしょう。たとえば、ユニットテストを一番下に置くと、 '#include" unittest ++。h "'はすべてのユニットテストマクロの前にファイルの終わりに近づくかもしれません。それはうまくいくようですが、おそらくは悪い形です。おそらく –

3

あなたは、あなたの最初のステートメントとして::使用してグローバル名前空間から何かを参照することができ、あなたの質問に正確に答えるために:もちろん

void foo() {    
     ::shake_and_bake(); 
    } 

を、あなたの答えは、この特殊なケースのためにかかわらず、権利であります。

+0

私はあなたがそれを行うことができたか分からなかった。グローバルネームスペースと現在のネームスペースの両方で同じ名前のものが宣言されている場合、これが便利なのは唯一の状況ですか? –

+0

それも私がそれを理解する方法です。しかし、私は、gtest(Googleユニットテストのフレームワーク)のようなフレームワークがそれに重きを置いていることを知っています。したがって、他の選択肢がない場合があります。 Koenigルックアップはときどき複雑になることがあります:) – Dinaiz

+0

数年前から私自身の質問に対する答えを見て、まだ物事を学ぶのはすごくです。 Koenig Lookupはクールで、しばらく使っています。 –

関連する問題