Pregunta

¿Es posible usar " usando " declaración con clases base de plantilla? He leído que no es aquí pero ¿es por una razón técnica o está en contra del estándar C ++, y se aplica a gcc u otros compiladores? Si no es posible, ¿por qué no?

Código de ejemplo (del enlace de arriba):

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

struct B : A {
    using A::f<int>;
};
¿Fue útil?

Solución

Lo que vinculó es una directiva de uso. Una declaración de uso se puede usar bien con clases base con plantilla (no lo he buscado en el estándar, pero solo lo probé 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 la función foo sin parámetros debido a que nuestra declaración de uso la vuelve a declarar en el ámbito 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 puede usar una plantilla-id (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); 
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top