2016-09-22 6 views
1

Apache Xercesを使用する巨大なコードベースで作業しています。私はclang ++でコードを構築していますが、エラーが発生しました。インクルードとフォワード宣言の両方ともエラー

特定の.hファイルa.ha.cppのヘッダに、前方宣言の両方が存在するクラスのヘッダーファイルを含む次のように属性 -

#include <xercesc/sax2/Attributes.hpp> 

namespace XERCES_CPP_NAMESPACE{ 
    class Attributes; 
} 

ファイルxercesc/sax2/Attributes.hppはコードを有する

XERCES_CPP_NAMESPACE_BEGIN 
...<some code>... 
class SAX2_EXPORT Attributes { 
    ...<some code>... 
} 
...<some code>... 
XERCES_CPP_NAMESPACE_END 

ここでエラー打ち鳴らすとコードをビルドする

a.cpp:45:39: error: member access into incomplete type 'const obixercesc_2_8::Attributes' 
a.h:20:10: forward declaration of 'obixercesc_2_8::obixercesc_2_8::Attributes' 
    class Attributes; 

これはエラー

void f(const XERCES_CPP_NAMESPACE::Attributes& attrs) { 
/* this line ---> */ const XMLCh * pAppName = attrs.getValue(X("appName")); 

を提起しかし、私は前方宣言をコメントアウトするとき、これは完全に罰金コンパイルa.cppから対応する線でありながら、また、アトリビュートヘッダーのみをahに含めますこのコードは、clang ++の代わりにg ++を使用するときにもビルドされています。私はいくつかのことを理解していない

から

1)なぜそれは前方宣言と含ま両方が存在するとき++打ち鳴らすに構築されていませんか?

2)クラス属性の実際の名前空間であるXERCES_CPP_NAMESPACE :: Attributesではなくobixercesc_2_8 :: Attributesを指すエラーが発生するのはなぜですか?

3)コードがg ++でコンパイルされるのはなぜですか?

答えて

1

これは解決策よりも多くの仮説ですが、とにかくここでは考えています。ネストされた名前空間obixercesc_2_8::obixercesc_2_8に誤っAttributesフォワード宣言されているいくつかの理由

、そしてあなたがobixercesc_2_8::Attributesに言及しているとき、彼らは(多分理由はAの同じ名前空間ではないので、打ち鳴らすはXercesのから実装の上に前方宣言を選びますusing namespace)?視点からは、Attributesという2つの宣言があり、1つはobixercesc_2_8に、もう1つはobixercesc_2_8::obixercesc_2_8にあります。 XERCES_CPP_NAMESPACEは、obixercesc_2_8に展開されるマクロのようです。

+0

これが問題でした。ありがとう。 – Sashank

関連する問題