2011-10-02 15 views
5

Algo como, por ejemplo,¿Pueden las especializaciones de una función de plantilla ser virtuales?

class A { 
    template<typename T> T DoStuff(); 
    template<> virtual int DoStuff<int>() = 0; 
}; 

Visual Studio 2010 dice que no, pero me da una sensación extraña que simplemente la pata de la sintaxis. ¿Pueden las especializaciones explícitas completas de una plantilla de función miembro ser virtuales?

+0

Debería obtener un error incluso si deja caer 'virtual', ¿verdad? –

+1

Incluso si fuera legal. ¿Por qué harías la vida más difícil a los mantenedores escribiendo eso? Recuerde que posee un Axe. –

+0

@ Tux-D: Porque si bien podría crear funciones DoStuffInt para aproximadamente cinco o más tipos diferentes, en realidad no es la solución ideal y, en segundo lugar, porque los encabezados de Windows tienen un billón de problemas de fugas macro que esto evitaría, mientras que algunos de mis nombres de funciones normales tendrían un problema. – Puppy

Respuesta

8

Las especializaciones explícitas no son legales dentro de una clase. Incluso si pudieras convertirlo en una especialización parcial, aún te encontrarás con el problema de que "las plantillas no pueden ser virtuales".

n3290, § 14.5.2 estados: plantilla de función

Un miembro no estará virtual.

y da este ejemplo:

template <class T> struct AA { 
    template <class C> virtual void g(C); // error 
    virtual void f(); // OK 
}; 

Antes de pasar a afirmar que la función miembro plantillas no cuentan para las anulaciones virtuales también.

+0

No puede especializar parcialmente una plantilla de función. http://www.gotw.ca/publications/mill17.htm –

+0

@ n.m - cierto, eso fue más un hipotético "incluso si". Sin embargo, voy a aclararlo en el texto. – Flexo

2

Según C++ 98, la plantilla de función de miembro estándar no será virtual. http://www.kuzbass.ru:8086/docs/isocpp/template.html.

-3- Una plantilla de función miembro no debe ser virtual. [Ejemplo:

template <class T> struct AA { 
    template <class C> virtual void g(C); // error 
    virtual void f();      // OK 
}; 
0

Usted puede obtener un efecto similar por la sobrecarga de la plantilla de función con una función virtual no molde regular.

Cuestiones relacionadas