2016-11-02 43 views
0

これはかなり基本的な質問ですが、私自身はネームスペースを決して定義していません。 Qtベースのライブラリのクラスをさまざまな名前空間にグループ化しようとしています(また、名前の競合のない拡張が容易です)。C++ネームスペース - ネストされたネームスペースの前方宣言と可視性

namespace lib { 
    class LibClass; 
} 

このLibClassはに含まれている他のヘッダファイルに定義されている他の名前空間とクラスの束を使用する:(たとえば、図書を表す)メインクラスは、トップレベルの名前空間libに属しLibClassのヘッダ:

#include <QObject> 
#include "libclass_global.h" 
#include "Manager.h" 
#include "Configurator.h" 

namespace lib { 
    class LibClass; 
} 

class LIBCLASSSHARED_EXPORT LibClass : public QObject { 
    public: 
     LibClass(); 
     ... 
    signals: 
     ... 
    private slots: 
     ... 
    public slots: 
     ... 
    private: 
     lib::core::communication::Manager manager;    // PROBLEM HERE 
     lib::core::communication::Configurator configurator; // PROBLEM HERE 
} 

Manager.h

namespace lib { 
    namespace core { 
     namespace communication { 
      class Manager; 
     } 
    } 
} 

class Manager { 
    public: 
     Manager(); 
     ... 
    private: 
     ... 
} 
を含みます

namespace lib { 
    namespace core { 
     namespace communication { 
      class Configurator; 
     } 
    } 
} 

class Configurator { 
    public: 
     Configurator(); 
     ... 
    private: 
     ... 
} 

クラスの内容を含む

Configurator.hは、ここでは重要ではありません。

コンパイルすると、q3dtpの名前空間にcoreという名前空間にタイプがありません。だから、基本的に私は名前空間が実際に(何らかの理由で)それらが含まれているヘッダファイルの挿入に含まれていないようですので、私のLibClassのヘッダに宣言を前方に使用する必要があります理解して何から:

namespace lib { 
    class LibClass; 

    namespace core { 
     namespace communication { 
      class Manager; 
      class Configurator; 
     } 
    } 
} 

その問題は、私がポインタ宣言に限定しているのは、ManagerConfiguratorを前方宣言しているからです。私は可能な限り(必要ではない)動的に要素を割り当てるのを避けたい。

ここで問題はどのように私はこの問題を解決するのですか?私は明らかにすべてのクラス宣言を同じヘッダとその定義に同じソースファイルに移すことができます。しかし、これは将来的に維持することをむしろ困難にするでしょう。サブネームスペースを宣言するだけでは問題は解決しないようです - どちらのクラスもタイプを指定せず、さらにLibClassにはメンバー名<name_of_class_from_nested_namespace>がありません。

答えて

5

LibClassの宣言が間違っています。それは次のようになります。

namespace lib { 
    class LibClass; 
} 

class lib::LibClass { 
    ... 
}; 

または

namespace lib { 
    class LibClass { 
     .... 
    }; 
} 

それは現在、あなたがlib::LibClassを宣言し、::LibClass(2全く異なるクラス)を定義している現状では

他のすべてのクラスにも適用されます。あなたは

namespace ns { 
    class cls; 
}; 

class cls { 
}; 

を行うと

2

あなたは前方に1型を宣言した後、別のを定義します。これは、ネストされた名前空間のためにあまりにも面倒になった場合、あなたは次の操作を行うことができ、C++ 17に沿って到来とともに

namespace ns { 
    class cls; 
}; 

class ns::cls { 
}; 

:あなたは、クラス名を修飾する必要があり

namespace ns1::ns2::ns3 { 

    class cls { 
    }; 

} 
関連する問題