2016-09-22 121 views
1

我正在研究使用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 ++编译?

回答

1

这是一个比解决方案更多的假设,但无论如何,这里有一个想法。

出于某种原因,你是前瞻性声明Attributes错误地嵌套命名空间obixercesc_2_8::obixercesc_2_8,当你指的是obixercesc_2_8::Attributes,铛选择您的向前声明了从Xerces的实施,因为它们不在同一个命名空间(也许因为一个using namespace声明?)。从它的观点来看,你有两个声明Attributes,一个在obixercesc_2_8和一个在obixercesc_2_8::obixercesc_2_8XERCES_CPP_NAMESPACE似乎是一个扩展到obixercesc_2_8的宏。

+0

这是问题所在。谢谢。 – Sashank