2012-01-21 22 views
3

I持って、この次のシナリオこの名前空間の問題を解決するにはどうすればよいですか?

namespace A { 
    //... 
    class A { 
     public: 
     static void foo(); 
    } 
    //... 
    } //namespace A 

私がしようとしたとき、私は「fooはAのメンバーではありません」コンパイラが文句)(:: fooで別のクラスからのfoo()をアクセスしようとA :: A :: foo()を使用すると、未解決の外部について不平を言います。

どうすればこの問題を解決できますか?私は同じ名前空間内のクラスを作ることはかなり愚かで混乱につながると思いますが、コードの作成者ではなく、名前空間やクラス名を変更するとあまりにも多くの問題を引き起こすでしょう。

+0

[C++で同じ名前を共有するクラスと名前空間](http://stackoverflow.com/questions/4070915/classes-and-namespaces-sharing-the-same-name-in-c)の可能な複製。 –

+5

未解決の外部に関するエラーは、構文ではなくA :: A :: foo()を実装しなかったということです。実際、コンパイラはあなたが望むものを見つけました! 'foo'の実装で実装、コンパイル、リンクしましたか? – templatetypedef

+0

コードページに 'A :: A :: foo()'と 'foo'の実装を使った例です:http://codepad.org/3muVCfgM –

答えて

3

:: to名前空間階層の最上位に到達する。あなたのクラスは:: A :: A

編集:上記の名前空間についてのあなたの主な質問に答えます。しかし他の人が指摘しているように、あなたの問題はあなたがfooを定義していないことです。 Add

インラインvoid A :: A :: foo(){};

1

完全修飾を使用する場合は、A::A::foo()(実際には完全修飾を主張する場合は::A::A::foo())を使用します。

inline void A::A::foo() { ... } 

...または定義がヘッダファイルにin't場合inlineをスキップ:関数が未解決であるという事実は、ちょうどあなたがそれを定義していないことを意味します。

私はあなたの議論に「あまりにも多くの問題を引き起こします」とは思いません。何かが愚かな場合(チームメンバーがそれが間違っていると同意した場合)、後で問題を直ちに解決してください!あなたが待っている時間が長くなればなるほど、それはより多くの問題を引き起こし、より多くの問題になります!

関連する問題