On 9/19/07, personaje <[EMAIL PROTECTED]> wrote:
> Buenas gente,
>
> Tengo un problemita, estoy overlodeando el operador == para una clase
> template que tengo, pero cuando lo trato de especializar me tira que
> ya está definido. El código es el siguiente:
>
>
> ------------>B------------>B------------>B------------>B------------>B------------>B------------
> // Operador == para el TPoint
> template <class T1,class T2>
> bool operator==(TPoint<T1> PointA,TPoint<T2> PointB)
> {
> if(PointA.GetX()==PointB.GetX() && PointA.GetY()==PointB.GetY())
> return true;
> return false;
> }
>
> #define EPSILON 0.000000001
>
> // Operador == para el TPoint especializado en RealPoint
> template <>
> bool operator==(TPoint<double> PointA,TPoint<double> PointB)
> {
> if ( fabs(PointA.GetX()-PointB.GetX())<EPSILON &&
> fabs(PointA.GetY()-PointB.GetY())<EPSILON )
> return true;
> return false;
> }
> ------------8<------------8<------------8<------------8<------------8<------------8<------------
>
> TPoint es un template y tiene los métodos de acceso a X e Y (un punto
> 2D), lo tengo definido para int, y double (y otros, pero para el
> ejemplo alcanza), el problema es que no puedo usar == para double
> (está bien cómo lo hago?)
> Quiero que para cuando haga la comparación entre dos TPoint
> especializados en double me utilize la segunda versión... pero, como
> dije arriba, se me queja que ya se encuentra definido...
>
> qué estoy haciendo mal?
>
> Saludos
>
yo probe el siguiente codigo y compile con gcc sin problemas:
#include <cmath>
#include <iostream>
template<class T>
class TPoint
{
private:
T _x, _y;
public:
TPoint(T x, T y) {
_x = x;
_y = y;
}
T GetX() { return _x; }
T GetY() { return _y; }
};
// Operador == para el TPoint
template <class T1, class T2>
bool operator==(TPoint<T1> PointA, TPoint<T2> PointB)
{
if (PointA.GetX() == PointB.GetX() && PointA.GetY() == PointB.GetY())
return true;
return false;
}
#define EPSILON 0.000000001
// Operador == para el TPoint especializado en RealPoint
template <>
bool operator==(TPoint<double> PointA, TPoint<double> PointB)
{
if (fabs(PointA.GetX() - PointB.GetX()) < EPSILON &&
fabs(PointA.GetY() - PointB.GetY()) < EPSILON)
return true;
return false;
}
int main()
{
TPoint<double> pd1(1.2, 3.4);
TPoint<double> pd2(1.2, 3.4);
TPoint<double> pd3(3.2, 5.4);
std::cout << (pd1 == pd2) << std::endl;
std::cout << (pd1 == pd3) << std::endl;
TPoint<int> pi1(1, 3);
TPoint<int> pi2(1, 3);
TPoint<int> pi3(2, 4);
std::cout << (pi1 == pi2) << std::endl;
std::cout << (pi1 == pi3) << std::endl;
return 0;
}
proba intercambiar el orden de instanciaciones en tu main
TPoint<int> p1;
TPoint<double> p2;
por
TPoint<double> p2;
TPoint<int> p1;
y fijate si tu mensaje de error es el mismo.
slds.
Francisco
_______________________________________________
Lista de correo Programacion.
[email protected]
http://listas.fi.uba.ar/mailman/listinfo/programacion