Apache Xercesを使用する巨大なコードベースで作業しています。私はclang ++でコードを構築していますが、エラーが発生しました。インクルードとフォワード宣言の両方ともエラー
特定の.hファイルa.h
、a.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 ++でコンパイルされるのはなぜですか?
これが問題でした。ありがとう。 – Sashank