J'ai donc une classe de base abstraite sans méthodes abstraites. Afin d'appliquer l'abstrait, j'ai déclaré le destructeur (non trivial) comme virtuel pur:
warning C4505: 'AbstractClass::~AbstractClass' : unreferenced local function has been removed
4 Réponses :
Avez-vous essayé de définir les destructeurs de manière non en ligne? Peut-être que l'avertissement est lié à cela. P>
tel que Ce code . P>
J'ai essayé le code dans votre lien; Il obtient le même avertissement même si, comme avant, cela fonctionne correctement lorsqu'il est exécuté.
Le code ne doit pas compiler. Les fonctions virtuelles pures ne peuvent pas être définies dans la définition de la classe. Déplacez la définition en dehors des classes:
struct IAlpha { virtual ~IAlpha() = 0; }; inline IAlpha::~IAlpha() {} // similarly for the rest.
Intéressant; Je ne savais pas que vous ne pouviez pas combiner le spécificateur virtuel pur et le corps de la méthode. Malheureusement, j'ai essayé cela aussi bien que l'avertissement apparaît toujours (voir la réponse de Jeffmagill).
Ceci est un bogue dans MSVC ++ 2010 et plus tôt. Le code obtient réellement appelé même si le compilateur prétend avoir supprimé le code. Il semble que Corrigé dans MSVC ++ 2012. D'autres compilateurs tels que GCC ou CLANG n'ont pas émettre un avertissement. La syntaxe "... = 0 {...}" est illégale selon la section standard C ++ 03 10.4.2 (même si MSVC ++ ne se plaint pas) car il a déjà été signalé:
Remarque: une déclaration de fonction ne peut pas fournir à la fois un spécificateur pur et une définition p> blockQuote>
Cependant, définir un destructeur virtuel pur en général n'est pas illégal et section 12.4.7 États: P>
Un destructeur peut être déclaré virtuel (10.3) ou virtuel pur (10.4); si Tous les objets de cette classe ou de toute classe dérivée sont créés dans le programme, le destructeur doit être défini. Si une classe a une classe de base avec un destructeur virtuel, son destructeur (soit utilisateur- implicitement déclaré) est virtuel. P> blockquote>
My Mode de désactivation de l'avertissement consiste à ajouter les lignes suivantes à l'en-tête: p>
xxx pré> Si vous souhaitez désactiver les avertissements plus localement, alors
#PRAGMA AVERTISSEMENT (PUSH) CODE> et
#PRAGMA AVERTISSEMENT (POP) CODE> pourrait être utile. Voir http://msdn.microsoft.com/ EN-US / Bibliothèque / 2C8F766E (v = vs.80) .aspx p>
Comme le code semble être appelé, vous pouvez ignorer les avertissements à mon avis. P> P> P> P >
Je serais intéressé de savoir où ce bogue a été signalé afin que je puisse la citer.
Vous ne pouvez pas définir la fonction virtuelle à en ligne. P>
Parce que la lignée est en cours de compilation. Le virtuel est en runtime. P>