2010-08-04 22 views
9

que tiene dos estructuras:C++: La herencia y la sobrecarga de operadores

template <typename T> 
struct Odp 
{ 
    T m_t; 

    T operator=(const T rhs) 
    { 
     return m_t = rhs; 
    } 
}; 

struct Ftw : public Odp<int> 
{ 
    bool operator==(const Ftw& rhs) 
    { 
     return m_t == rhs.m_t; 
    } 
}; 

Me gustaría que el siguiente para compilar:

int main() 
{ 
    Odp<int> odp; 
    odp = 2; 

    Ftw f; 
    f = 2; // C2679: no operator could be found 
} 

¿Hay alguna manera de hacer este trabajo, o debo definir el operador en Ftw también?

+0

Por lo general, el operador '=' toma parámetro de referencia const ... Sería mejor cambiar 'T operador = (const T RHS)' a 'operador T = (const T & rhs) ' – a1ex07

Respuesta

22

El problema es que el compilador generalmente crea un operator= para usted (a menos que proporcione uno), y este operator= oculta el heredado. Puede hacer caso omiso de esto mediante el uso-declaración:

struct Ftw : public Odp<int> 
{ 
    using Odp<int>::operator=; 
    bool operator==(const Ftw& rhs) 
    { 
     return m_t == rhs.m_t; 
    } 
}; 
+0

¡Agradable! No sabía sobre eso. –