' - Retrouvez les réponses et les commentaires concernant cette question" />
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 :: / 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() { /* ... */ }
};
/* ... */
}
3 Réponses :
C'est parce que vous avez oublié de déclarer l'héritage comme public. 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. P> P>
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 Code> n'a pas de portant sur ce problème.
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é code>. Le problème semble être, que GCC essaie d'exporter certains symboles de
principal code> (visible pour relier des exécutables et des bibliothèques), tandis que
action code> n'est pas exporté (invisible pour relier les exécutables et les bibliothèques ). Donc, la visibilité de
MainlockDetector code> est vraiment supérieure à la visibilité de
action code>. P>
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é code> 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é code> ne change rien. Je viens de découvrir que mon environnement de construction définit également
-fvisbilicabilité = caché code>. Alors pourquoi cela ne s'applique-t-il pas à
MainlockDetector code>?
Si -fvisbility-inlines-inlines - caché code> 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.
Pour résoudre ce problème, essayez l'un des ci-dessous.
Utilisez Utilisez 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> #pragma GCC Visibilité Push () Code> Déclaration comme celle-ci. p>
struct __attribute__ ((visibility("hidden"))) MainLockDetector : Action {
bool wait(Uint32 time) { /* ... */ }
int handle() { /* ... */ }
};
__ 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
Dans mon cas, j'avais besoin de struct __attribute__ ((visibilité ("Hidden"))) Structname {....}; code>
Quel champ code> signifie-t-il? S'il vous plaît poster le contenu de la classe locale.
OK, c'est la structure complète (sans code).