2010-09-01 10 views
5

Necesito aclarar la pregunta de por qué necesitamos el operador de resolución de alcance o el puntero this para acceder a los miembros heredados públicamente de una clase base de plantilla. Según tengo entendido, es para agregar claridad, pero ¿cómo agrega this más claridad que solo señalar que es miembro de la clase?Acceso a miembros de datos de plantilla heredados públicos

Para aclarar mi pregunta he agregado un código.

#include <iostream> 
using namespace std; 

template <class T, class A> 
class mypair { 
     public: 
     T a, b; 
    public: 
    mypair (T first, T second) 
     {a=first; b=second;} 

     virtual void printA() 
     { 
     cout<<"A"<<a<<endl; 
     cout<<"B"<<b<<endl; 
     } 
}; 







template <class T, class A> 
class next: mypair<T,A> 
{ 
public: 

     next (T first, T second) : mypair<T,A>(first, second) 
     { 
     } 

     void printA() 
     { 
     cout<<"A:"<<mypair<T,A>::a<<endl; // this->a; also works 
     cout<<"B:"<<mypair<T,A>::b<<endl; // this-b; also works 
     } 

}; 


int main() { 
    next<double,float> newobject(100.25, 75.77); 
    newobject.printA(); 
    return 0; 
} 

de salida:

A:100.25 
B:75.77 

Si quito el alcance (o este operador), entonces el error de falta de alcance viene. Pero, ¿por qué necesitamos un alcance para miembros heredados públicamente?

Algunas reflexiones sobre esto serían geniales.

Respuesta

4

Consulte Name lookup - Using the GNU Compiler Collection (GCC)

Mediante la adición del prefijo explícito mypair<T, A> o this->, haces argumento printA plantilla dependiente. Luego, las definiciones se resolverán durante la etapa de creación de instancias de la plantilla.

+0

Interesante Leer ¿Este es un caso especial solo con plantillas? – Sii

+0

Solo en funciones en la clase de plantilla. –

Cuestiones relacionadas