Disponible la nueva versión "donationware" 7.3 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.