2017-04-19 11 views
0

コンパイル対象が同じで、非常に同一な2つのプログラムAとBの間で使用したい共有ファイルがあります。名前空間を組み合わせたC++

だから、私はInterfaces.h

を2つの名前空間にそれらを分離し、共有ファイルの共有名前空間を作成しようとしました

namespace ns_s { 
    class SomeClass; 
    class IFoo { 
     virtual void bar(SomeClass*) = 0; 
    }; 
} 

SomeHeaderinA.h

#include "Interfaces.h" 

namespace ns_a { 
using namespace ns_s; 

    class Foo : public IFoo { 
     virtual void bar(SomeClass* p) override { ... } 
    }; 

} 

しかし、コンパイラ私のメンバーファンクションバーが何もオーバーライドしていないので、インターフェイスの実装が見えないようになっているので不平を言っています。 それはなぜですか?コンパイラはなぜIFooのクラスが不足していると不平を言っていないのですか?

EDIT: 問題に寄与する重要な部分が欠落しているように見えます。私はインターフェイスメソッドのパラメータであるクラスを事前に宣言しました。今度は、ネームスペース共有の事前宣言と、ネームスペースAの実際の宣言を思いつきました。これらのことはもう同じではありません。

これを修正する良い方法はありますか?インターフェイスの小さなサブセットだけが、それぞれ別のネームアダプタ(AまたはB)で定義された引数を持っているので、それぞれの実装を変えることはできますが、可能であれば、きれいなファッション。ここ

リンクが

http://coliru.stacked-crooked.com/a/79fa58e50e7b8637
+0

それは違いないだけオーバーライドされた機能について不平を言うならば、実際http://coliru.stacked-crooked.com/a/567d40d34199af73 – aschepler

+0

を再現することはできませんいくつかのIFoo宣言を見つけました。あなたが望むものではないかもしれません。 –

+0

ああ、ありがとう。だから、私はそれは私が根本的に正しいことをするが、それはどこかで間違っていることを意味すると仮定します。それは助けを助ける – chrise

答えて

0

するという問題

連結コードに示されているように、問題はSomeClassによって引き起こされます。

ライン

class SomeClass{}; 

は宣言し、名前空間ns_aSomeClass定義します。ネームスペースns_sにはSomeClassが定義されていません。

クラスns_s::IFoo::barの宣言には、ns_s::SomeClassが使用されます。

クラスns_a::IFoo::barの宣言には、ns_a::SomeClassが使用されます。

オーバーライドはエラーです。 ns_aの宣言:: IFoo ::バーにns_s::SomeClassを使用してns_a、または

  • からSomeClassの定義を削除

    1. ソリューション

      次の方法でそれを修正することができます。


    namespace ns_a { 
    
        using namespace ns_s; 
    
        class Foo : public IFoo { 
        virtual void bar(SomeClass* p) override {} 
        }; 
    } 
    

    または

    namespace ns_a { 
    
        using namespace ns_s; 
    
        class SomeClass{}; 
    
        class Foo : public IFoo { 
        virtual void bar(ns_s::SomeClass* p) override {} 
        }; 
    } 
    
  • +0

    はい、わかりました。したがって、問題はどのように修正することができますか?) – chrise

    関連する問題