2016-09-22 1 views
1

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 ++?

Répondre

1

Ceci est plus une hypothèse qu'une solution, mais de toute façon, voici une pensée.

Pour une raison quelconque vous en avant-déclarez Attributes par erreur dans l'espace de noms imbriqué obixercesc_2_8::obixercesc_2_8, et quand vous faites référence à obixercesc_2_8::Attributes, Clang choisit votre déclaration avant sur la mise en œuvre de Xerces parce qu'ils ne sont pas dans le même espace (peut-être à cause d'un using namespace déclaration?). De son point de vue, vous avez deux déclarations de Attributes, une en obixercesc_2_8 et une en obixercesc_2_8::obixercesc_2_8. XERCES_CPP_NAMESPACE semble être une macro qui s'étend à obixercesc_2_8.

+0

C'était le problème. Merci. – Sashank