es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Sobrecarga genérica del operador de igualdad (==) para amistad.

Actualmente estoy atascado en un problema que no puedo resolver. Soy principiante en el mundo de C++.

Para una tarea, tengo que crear una clase genérica que represente una fracción como 5/6 o 11/4. Esta clase es genérica, lo que permite determinar el tipo del numerador y del denominador (unsigned short, unsigned, unsigned long).

El objetivo es poder sumar, restar, multiplicar, dividir y comparar fracciones. En una primera fase, creé una clase e sobrecargas de operadores que me permiten hacer todo lo que se requiere, pero solo para instancias de la clase con el mismo tipo.

Ahora me gustaría mejorar el código existente para poder realizar operaciones entre fracciones de diferentes tipos, como por ejemplo: Frac == Frac. Pero hay algo que no entiendo en la sintaxis de sobrecarga de operadores.

Tomemos el operador == como ejemplo:

template
bool operator==(const Frac& lhs, const Frac& rhs) {
return (lhs.numerator == rhs.numerator && lhs.denominator == rhs.denominator);
}

template
class Frac {

friend bool operator==<>(const Frac& lhs, const Frac& rhs);

private:
T numerator, denominator;

}

Esta es la versión actual que funcionaba para las Fracs del mismo tipo. Pero ahora me gustaría que funcione para Fracs de diferentes tipos:

template
bool operator==(const Frac& lhs, const Frac& rhs){
return (lhs.numerator == rhs.numerator && lhs.denominator == rhs.denominator)
}

template
class Frac {

friend bool operator==<>(const Frac& lhs, const Frac& rhs);

private:
T numerator, denominator;

}

Pero tengo un error de compilación cuando quiero comparar Fracs de diferentes tipos… No entiendo y no pude encontrar ninguna solución que explique concretamente cuál es el problema y cómo implementar este tipo de solución correctamente.

¿Podrías ayudarme por favor?

Espero que mi pregunta sea clara y completa.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, puedo ofrecerte la siguiente solución:

    El error que estás recibiendo se debe probablemente a que tu declaración de amigo (friend declaration) en la clase Frac no es correcta para la sobrecarga del operador actualizada. En lugar de usar friend bool operator==<>, debes usar template<typename u=""> friend bool operator==(const Frac<t>& lhs, const Frac<u>& rhs);. Esto permitirá que la sobrecarga del operador tenga acceso a los miembros privados de la clase Frac.

    Aquí está el código actualizado para la sobrecarga del operador:

    template<typename t,="" typename="" u="">
    bool operator==(const Frac<t>& lhs, const Frac<u>& rhs){
        return (lhs.numerator == rhs.numerator && lhs.denominator == rhs.denominator);
    }
    

    Y aquí está la clase Frac actualizada:

    template <typename t="">
    class Frac {
        template<typename u=""> friend bool operator==(const Frac<t>& lhs, const Frac<u>& rhs);
    private:
        T numerator, denominator;
    };
    

    Esto te permitirá comparar instancias de Frac de diferentes tipos. Recuerda siempre incluir la declaración de amigo (friend declaration) para cualquier sobrecarga de operador que necesite acceso a los miembros privados de la clase.

Comments are closed.