pur-spécificateur sur fonction-définition

Lors de la compilation sur GCC, j'obtiens l'erreur : pure-specifier sur function-definition, mais pas quand je compile le même code en utilisant VS2005.

class Dummy {   
  //error: pure-specifier on function-definition, VS2005 compiles 
  virtual void Process() = 0 {};
};

Mais lorsque la définition de cette fonction virtuelle pure n'est pas en ligne, cela fonctionne:

class Dummy
{
  virtual void Process() = 0;
};
void Dummy::Process()
{} //compiles on both GCC and VS2005

Que signifie l'erreur? Pourquoi ne puis-je pas le faire en ligne? Est-il légal d'échapper au problème de compilation comme indiqué dans le deuxième exemple de code?

32
demandé sur Bébul 2010-06-01 19:56:10

6 réponses

Ok, je viens d'apprendre quelque chose. Une fonction virtuelle pure doit être déclarée comme suit:


class Abstract 
{
public:
   virtual void pure_virtual() = 0;
};

Il peut avoir un organisme, bien qu'il soit illégal de l'inclure au point de déclaration. Cela signifie que pour avoir un corps, la fonction virtuelle pure doit être définie en dehors de la classe. Notez que même si elle a un corps, la fonction doit toujours être remplacée par des classes concrètes dérivées de Abstract. Ils auraient juste une option pour appeler Abstract::pure_virtual() explicitement s'ils en ont besoin.

Le les détails sont ici.

28
répondu Dima 2010-06-01 16:10:46

Norme C++, 10.4 / 2:

Une déclaration de fonction ne peut pas fournir à la fois un spécificateur pur et une définition

16
répondu Paul 2010-06-01 16:03:16

Cette syntaxe:

virtual void Process() = 0 {};

N'est pas légal C++, mais est pris en charge par VC++. Exactement pourquoi la norme interdit cela n'a jamais été évident pour moi. Votre deuxième exemple est légal.

11
répondu 2010-06-01 16:00:10

Des fonctions virtuelles Pures en C++, par définition, n'ont aucune définition de dans la déclaration.

Votre deuxième bloc de code n'évite pas le problème du compilateur. Il implémente une fonction virtuelle pure comme prévu.

La question à se poser est, pourquoi avez-vous besoin de le déclarer pur virtuel si vous avez l'intention d'avoir une implémentation par défaut?

4
répondu Amardeep AC9MF 2010-06-01 16:09:18

Ceci est gramatiquement refusé - le déclarateur qui peut inclure pur-spécificateurs , c'est-à-dire le membre-déclarateur, apparaît uniquement dans les déclarations qui ne sont pas des définitions. [classe.mem] :

membre-déclaration:
attribute-specifier-seqoptdecl-specifier-seqoptmember-declarator-listopt;
la fonction de définition
         [...]

membre de demande de déclaration-liste:
membre-déclaration de
          membre-déclarateur-liste , membre-déclarant

membre de demande de déclaration:
déclaration de virt-spécificateur-seqoptpure-rédacteur de devisopt
         déclaration de corset ou égal initialiseuropt
         identificateuroptattribut spécificateur-seqopt: constante de l'expression

La grammaire de function-definitionn'inclut pas un pur-spécificateur, [dcl.fct.def.général]:

la fonction de définition:
attribute-specifier-seqoptdecl-specifier-seqoptdeclarator virt-spécificateur-seqoptla fonction-corps

3
répondu Columbo 2015-04-19 19:50:38

Vous pouvez certainement fournir un corps pour la fonction virtuelle pure. Cette fonction sera pointée par cette classe abstraite vtable. Sinon, le même emplacement pointera vers une fonction de trap spécifique au compilateur comme __cxa_pure_virtual pour GCC. Il n'y a bien sûr rien à ce sujet dans la norme.

0
répondu Nikolai Fetissov 2010-06-01 16:20:22