Problemas de compilación Borland C++ 5.5
A pesar de tenerse en cuenta lo indicado respecto a las opciones de compilación
( BC++ 55 compiler switches), el
ejemplo de referencia produce errores cuando se intenta compilar con Borland C++ 5.5, a pesar de hacerlo correctamente con MS
Visual C++ 6.0.
Tras varios intentos, descubrimos que (aparentemente) el problema está en que el mecanismo de plantillas no reconoce la
definición de la versión sobrecargada de operator>( ) en la clase Vector cuando la sobrecarga se efectúa
siguiendo la modalidad a (
4.9.18b) es decir: "Declarando una función miembro no estática que acepte un argumento".
En cambio, adoptando la opción b: "Declarando una función no miembro que acepte dos argumentos", la
compilación se realiza sin problemas.
Esta es la versión que se construye correctamente con el compilador Borland:
#include <iostream>
using namespace std;
class Vector {
public: float x, y;
};
bool operator>(Vector v1, Vector v2) {
return ((v1.x * v1.x + v1.y * v1.y) > (v2.x * v2.x + v2.y * v2.y)) ? true: false;
}
template<class T> T max(T a, T b) { return (a > b) ? a : b; };
void main() { // =====================
Vector v1 = {2, 3}, v2 = {1, 5};
int x = 2, y = 3;
cout << "Mayor: " << max(x, y) << endl; // M3
cout << "Mayor: " << max(v1, v2).x << ", " << max(v1,v2).y << endl;
}
Las salidas son las esperadas:
Mayor: 3
Mayor: 1, 5
Comentario
En este momento ignoro el motivo de esta aparente anomalía; puede tratarse de un "bug" de compilador o de un error no detectado por mi parte. En cualquier caso, si algún lector avispado tiene la respuesta le agradecería unas líneas al respecto ajm@zator.com.