¡Nuevo!  por fin disponible la versión 5 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


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.