2008-12-06 10 views
5

¿Es posible usar la declaración "using" con clases base de plantilla? He leído que no es here, pero ¿es por un motivo técnico o está en contra del estándar C++, y se aplica a gcc u otros compiladores? Si no es posible, ¿por qué no?¿Se puede usar la declaración "using" con plantillas?

Código de ejemplo (desde el enlace de arriba):

struct A { 
    template<class T> void f(T); 
}; 

struct B : A { 
    using A::f<int>; 
}; 
+0

¿Puede añadir un poco más de información a su pregunta? ¿Qué crees que es exactamente ilegal? El enlace no menciona nada sobre las plantillas – JaredPar

+0

Jared, he corregido el enlace. –

+0

Sí, lo siento, copié el enlace de la barra de direcciones y fue el incorrecto. – Sydius

Respuesta

4

Lo que se ha vinculado a una directiva using. Una declaración using se puede utilizar muy bien con las clases de base con plantilla (no han mirado hacia arriba en la norma, pero sólo probado con un compilador):

template<typename T> struct c1 { 
    void foo() { std::cout << "empty" << std::endl; } 
}; 

template<typename T> struct c2 : c1<T> { 
    using c1<T>::foo; 
    void foo(int) { std::cout << "int" << std::endl; } 
}; 

int main() { 
    c2<void> c; 
    c.foo(); 
    c.foo(10); 
} 

El compilador encuentra correctamente el foo función sin parámetros debido nuestra declaración de uso vuelve a declararlo en el alcance de c2 y genera el resultado esperado.

Editar: actualizó la pregunta. aquí está la respuesta actualizada:

El artículo tiene razón acerca de que no se le permite usar un ID de plantilla (nombre de plantilla y argumentos). Pero puede poner un nombre de plantilla:

struct c1 { 
    template<int> void foo() { std::cout << "empty" << std::endl; } 
}; 

struct c2 : c1 { 
    using c1::foo; // using c1::foo<10> is not valid 
    void foo(int) { std::cout << "int" << std::endl; } 
}; 

int main() { 
    c2 c; 
    c.foo<10>(); 
    c.foo(10); 
} 
+0

Esto es otra cosa. El OP probablemente significó una plantilla de función miembro que reside en la clase base. –

+0

Lo siento, soy nuevo en lo de usar. ¿Es posible llamar a foo desde un método c2 sin tener que especificar la clase base, es decir, "foo()" en lugar de "c1 :: foo()"? – Sydius

+0

Sydius, sí haces esto-> foo(); el foo está en la clase base, y eso depende de un parámetro de plantilla. el estándar dice que la llamada debe calificarse con el operador de alcance (c1 :: foo()) o usando this-> foo() ;. de lo contrario, asume que "foo" es una función global –

Cuestiones relacionadas