' - Retrouvez les réponses et les commentaires concernant cette question" />
8
votes

C ++: AVERTISSEMENT: "..." déclaré avec une plus grande visibilité que le type de son champ "...: '

Je reçois ces deux avertissements (avec gcc 4.2 sur MacOSX):

/ users / az / programmierung / openlierox / construction / xcode /../../ src / main.cpp: 154: 0 / Utilisateurs / AZ / PROGRAMMIERUNG / OPENLIEROX / BUILD / XCODE /../../ SRC / MAIN.CPP: 154: AVERTISSEMENT: 'StartMainLockDetector () :: MainlockDetector' déclaré avec une plus grande visibilité que le type de son champ 'StartMainLockDetector () :: MainlockDetector :: ' p>

/ users / az / programmierung / openlierox /. / xcode /../../ src / main.cpp: 154: 0 / users / az / programmierung /openlierox/builild/xcode/../../src/main.cpp:154: AVERTISSEMENT: 'StartMainLockDetector () :: MainlockDetector' déclaré avec une plus grande visibilité que sa base 'Action' P>

dans cette CODE: P>

struct Action {
    virtual ~Action() {}
    virtual int handle() = 0;
};


static void startMainLockDetector() {
    /* ... */

    struct MainLockDetector : Action {
         bool wait(Uint32 time) { /* ... */ }
         int handle() { /* ... */ }
    };

    /* ... */
}


2 commentaires

Quel champ signifie-t-il? S'il vous plaît poster le contenu de la classe locale.


OK, c'est la structure complète (sans code).


3 Réponses :


-5
votes

C'est parce que vous avez oublié de déclarer l'héritage comme public. XXX

Ceci provoque des membres "Action" d'être privé. Mais, vous venez de remplacer un membre privé d'action en tant que public (défaut public dans une structure), qui pourrait casser l'encapsulation, d'où l'avertissement.


3 commentaires

Cela n'a aucun sens pour moi. Comme vous vous disent que vous vous dissiez «par défaut publique dans une structure», le «public» est facultatif (c'est la valeur par défaut pour les membres et l'héritage).


Pas de changement, toujours le même avertissement. Aussi "public" n'a pas de sens pour les structures.


Déclaration de l'héritage Public n'a pas de portant sur ce problème.



1
votes

Il semble y avoir un problème avec des bibliothèques partagées. Je suppose que vous écrivez une bibliothèque partagée. Regardez Cette explication . Essayez d'ajouter l'option de ligne de commande -fvisibilité-inlines-inlines-caché . Le problème semble être, que GCC essaie d'exporter certains symboles de principal (visible pour relier des exécutables et des bibliothèques), tandis que action n'est pas exporté (invisible pour relier les exécutables et les bibliothèques ). Donc, la visibilité de MainlockDetector est vraiment supérieure à la visibilité de action .


7 commentaires

Non, ce n'est pas une bibliothèque partagée, c'est juste une application. Mais pourquoi EXACTEMLLockDetector est-il exporté et l'action n'est-elle pas?


Avez-vous lu le papier lié. La partie intéressante est à l'intérieur de la section 2.2.4.


Ok, je l'ai lu maintenant (pas tous sauf 2.2.4 et un peu plus, la plupart des 2. *). Vraiment intéressant. Mais est -fvisbilicabilité-inlines-caché lié ​​à mon problème? Parce que j'ai StartMainLockDetector n'est pas indiqué comme inlicalement. En outre, pourquoi n'est-ce pas exactement l'action? Pour autant que je comprenne le papier, tout devrait être exporté par défaut, alors pourquoi ne pas l'action?


Je suis un peu confus sur la visibilité. J'ai formulé une question séparée ici . Peut-être que cela clarifiera également les choses ici.


Pourriez-vous également nous dire, si le changement des attributs de visibilité a aidé du tout?


Oui, -Fvisibilité-inlines-caché ne change rien. Je viens de découvrir que mon environnement de construction définit également -fvisbilicabilité = caché . Alors pourquoi cela ne s'applique-t-il pas à MainlockDetector ?


Si -fvisbility-inlines-inlines - caché n'a pas aidé du tout et les autres changements de visibilité (attributs de pragmas) ne fonctionnent pas aussi, peut-être que le problème réside ailleurs.



4
votes

Pour résoudre ce problème, essayez l'un des ci-dessous.

  1. Utilisez #pragma GCC Visibilité Push () Code> Déclaration comme celle-ci. p>

    struct __attribute__ ((visibility("hidden"))) MainLockDetector : Action {
         bool wait(Uint32 time) { /* ... */ }
         int handle() { /* ... */ }
    };
    
  2. Utilisez __ attribut__ ((visibilité ("caché"))) code> comme ceci. P>

    #pragma GCC visibility push(hidden)
    struct MainLockDetector : Action {
         bool wait(Uint32 time) { /* ... */ }
         int handle() { /* ... */ }
    };
    #pragma GCC visibility pop
    
  3. Ajoutez l'option de ligne de commande -fvisbilicabilité = Par défaut. P> Li> OL>

    Pour plus de détails, reportez-vous à http://gcc.gnu.org/wiki/ Visibilité . P> p>


1 commentaires

Dans mon cas, j'avais besoin de struct __attribute__ ((visibilité ("Hidden"))) Structname {....};