Sstream redéclaré avec une erreur du compilateur d’access public

Je suis tombé sur cette erreur lors de l’exécution de make sur un grand projet utilisant gcc5.4.0.

/usr/include/c++/5/sstream:300:14: error: '__xfer_bufptrs' redeclared with 'public' access struct __xfer_bufptrs ^ /usr/include/c++/5/sstream:67:14: note: previously declared 'private' here struct __xfer_bufptrs; 

Pour moi, cela semble être un problème avec le compilateur? Depuis le problème se pose dans une bibliothèque standard c ++ sstream? Cela n’a pas de sens pour moi, est-ce que j’utilise un mauvais compilateur?

Voici les extraits de code auxquels les messages d’erreur font référence:

1.) sstream à partir de la ligne 67

 class basic_ssortingngbuf : public basic_streambuf { struct __xfer_bufptrs; public: 

2.) sstream à la ligne 300

 #if _GLIBCXX_USE_CXX11_ABI // This type captures the state of the gptr / pptr pointers as offsets // so they can be restored in another object after moving the ssortingng. struct __xfer_bufptrs { __xfer_bufptrs(const basic_ssortingngbuf& __from, basic_ssortingngbuf* __to) : _M_to{__to}, _M_goff{-1, -1, -1}, _M_poff{-1, -1, -1} { 

Je sais que la bibliothèque standard ne peut avoir aucun problème, alors pourquoi génère-t-elle une erreur?

C’est le plus proche de ma réponse: https://github.com/PacificBiosciences/pbbam/issues/14

Et il semble que la réponse tourne autour de ces drapeaux “Dprivate” et “Dpublic”. Je suppose que ce sont des drapeaux de compilation, mais je ne suis pas sûr de ce qu’ils font.

Bien que le fil chez github frappe la tache, il semble manquer la raison. Vous construisez probablement dans votre projet des tests unitaires ou autres qui redéfinissent le mot clé ‘private’ comme ceci:

 #define private public 

Ou bien faites la chose respective via une commande comme ( -Dprivate=public ). Il s’agit d’une pratique couramment utilisée pour exposer des membres privés à des fins de test sans rendre le code testé dépendant du code de test. Cependant, regardez vos extraits. Le premier déclare __xfer_bufptrs comme privé quelle que soit votre définition de private . Le deuxième extrait est sûrement (pas encore vérifié) dans un bloc private explicite. Maintenant, si votre définition de privé est en place, vous rencontrerez public dans le deuxième extrait, ce qui est une faute.

Vous avez au moins deux options, d’autres sont sûrement aussi possibles:

  1. Vous #undef la définition privée avant d’inclure les en-têtes système et vous définissez à nouveau après l’inclusion de ceux-ci, ou
  2. Vous utilisez une autre macro pour définir vos propres sections privé / public, par exemple: #define my_public public qui peut être redéfini à volonté. Cette solution semble cependant difficile;)

Oh, et pour l’avenir, dans votre propre code, utilisez toujours une qualification d’access explicite pour éviter ce genre de problème au moins avec votre propre code 🙂