我正在研究使用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