Je travaille sur une énorme base de code qui utilise Apache Xerces. Je construis le code avec clang ++ et ça donne une erreur.Erreur avec les instructions include et forward
Dans un fichier .h particulier a.h
, en-tête pour a.cpp
, il est à la fois la déclaration avant et inclure des fichiers d'en-tête de la classe Attributs comme suit: -
#include <xercesc/sax2/Attributes.hpp>
et
namespace XERCES_CPP_NAMESPACE{
class Attributes;
}
Le fichier xercesc/sax2/Attributes.hpp
a le code
XERCES_CPP_NAMESPACE_BEGIN
...<some code>...
class SAX2_EXPORT Attributes {
...<some code>...
}
...<some code>...
XERCES_CPP_NAMESPACE_END
L'erreur ici tout en construisant le code avec clang est
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;
Ceci est la ligne correspondante de a.cpp qui déclenche l'erreur
void f(const XERCES_CPP_NAMESPACE::Attributes& attrs) {
/* this line ---> */ const XMLCh * pAppName = attrs.getValue(X("appName"));
Mais cette compile parfaitement bien quand je commente la déclaration anticipée et inclure uniquement l'en-tête Attributs dans ah Le code construit aussi quand j'utilise g ++ au lieu de clang ++.
Je ne comprends pas peu de choses -
1) Pourquoi est-il pas construit avec clang ++ quand il y a deux déclaration avant et inclure?
2) Pourquoi l'erreur pointe-t-elle sur les attributs obixercesc_2_8 ::, mais pas sur XERCES_CPP_NAMESPACE :: Attributes, l'espace de nom réel des attributs de classe?
3) Pourquoi le code est-il compilé avec g ++?
C'était le problème. Merci. – Sashank