我正在研究使用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;
這是a.cpp相應的線,引發錯誤
void f(const XERCES_CPP_NAMESPACE::Attributes& attrs) {
/* this line ---> */ const XMLCh * pAppName = attrs.getValue(X("appName"));
但是當我註釋掉向前聲明該編譯完全正常並且只包含啊中的Attributes頭當我使用g ++代替clang ++時,代碼也在構建中。
我不明白一些事情 -
1)爲什麼不鏗鏘++當有正向的聲明,包括建築?
2)爲什麼錯誤指向obixercesc_2_8 :: Attributes,而不是XERCES_CPP_NAMESPACE :: Attributes,類Attributes的實際名稱空間?
3)爲什麼代碼用g ++編譯?
這是問題所在。謝謝。 – Sashank