2010-06-01 21 views
29

Al compilar en GCC recibo el error : especificador puro en la definición de función, pero no cuando compilo el mismo código usando VS2005.pure-specifier en la definición de función

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

Pero cuando la definición de esta función virtual pura no está en línea, funciona:

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

lo que hace el medio de error? ¿Por qué no puedo hacerlo en línea? ¿Es legal evadir el problema de compilación como se muestra en la segunda muestra de código?

Respuesta

24

Ok, acabo de enterarme de algo. Una función virtual pura debe ser declarado de la siguiente manera:


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

puede tener un cuerpo, a pesar de que es ilegal para incluirlo en el punto de la declaración. Esto significa que para tener un cuerpo, la función virtual pura debe definirse fuera de la clase. Tenga en cuenta que incluso si tiene un cuerpo, la función aún debe ser anulada por cualquier clase concreta derivada de Abstract. Simplemente tendrían la opción de llamar al Abstract::pure_virtual() explícitamente si fuera necesario.

Los detalles son here.

+2

Sí, debería, si necesita una. Es perfectamente legal tener uno. –

+0

Pero con un cuerpo solo sería una función virtual. ¿Qué debería hacer una función virtual pura con un cuerpo? –

+1

@ Martin Posiblemente nada - si se declara un destructor virtual puro (por ejemplo) que debe darle un cuerpo. –

10

Esta sintaxis:

virtual void Process() = 0 {}; 

no es legal C++, pero se apoya en VC++. Exactamente por qué el estándar no permite esto nunca ha sido obvio para mí. Tu segundo ejemplo es legal.

4

funciones virtuales puras en C++, por definición, no tienen una definición en la declaración.

Su segundo bloque de código no está evitando el problema del compilador. Está implementando una función virtual pura de la manera que se pretendía.

La pregunta que debe hacerse es, ¿por qué necesita declararla puramente virtual si tiene la intención de tener una implementación predeterminada?

+2

Las funciones virtuales puras pueden tener definición. Piensa en el destructor virtual puro: DEBE definirse. – Paul

+1

Por favor, ¿me iluminas con el propósito de un destructor virtual puro? –

+1

Haces un destructor puro cuando no desea que su clase instancia y no hay otros candidatos PVF. Un requisito bastante raro, estoy de acuerdo. –

16

C++ estándar, 10.4/2:

a function declaration cannot provide both a pure-specifier and a definition

+0

Esto no es normativo, sino tomado de una nota. – Columbo

+0

@Columbo Bueno, según §6.5.1 de la norma ISO/IEC Directivas Parte 2 notas no deberá contener permisos en absoluto. Si bien esta nota claramente contiene uno, que me engaña. Todavía los modernos GCC y Clang no permiten esto, ¿violan el estándar? – Paul

+0

Protip: lee mi respuesta. La nota * es * correcta, pero para 'probar' ésta tiene que mostrar las reglas de la gramática. – Columbo

0

Por supuesto que puede proporcionar un cuerpo para la función virtual pura. Esa función será señalada por esa clase abstracta vtable. De lo contrario, la misma ranura apuntará a la función de captura específica del compilador como __cxa_pure_virtual para GCC. Por supuesto, no hay nada sobre esto en el estándar.

3

Esto es gramaticalmente no permitidos - la declarador que puede incluir puros especificadores, es decir la miembro-declarador, sólo aparece en las declaraciones que no son definiciones. [Class.mem] :

member-declaration:
         attribute-specifier-seqopt decl-specifier-seqoptmember-declarator-listopt;
         function-definition
         [...]

member-declarator-list:
         member-declarator
         member-declarator-list , member-declarator

member-declarator:
         declarator virt-specifier-seqoptpure-specifieropt
         declarator brace-or-equal-initializeropt
         identifieroptattribute-specifier-seqopt:constant-expression

La gramática de la función definición no incluye un pura-especificador, [dcl.fct.def.general]:

function-definition:
     attribute-specifier-seqopt decl-specifier-seqoptdeclarator virt-specifier-seqoptfunction-body

Cuestiones relacionadas