Tienes hecha mal la sobrecarga.
A parte de eso puedes hacer uso de algo más primitivo que las plantillas: el preprocesador.
Un ejemplo de cómo hacerlo sería así:
#include <iostream>
using namespace std;
class Num
{
public:
double a, b;
/* Dentro del mismo objeto, o en el archivo de implementación
* preparo una macro que contendrá el código al que solo deberé
* pasarle el operador que quiero. Pero cuidado pues el operador
* deberá ser compatible. Solo sirve para ahorrar código.
*/
#define SET_OP(op) \
Num operator op(const Num &p) \
{ \
Num erg; \
erg.a = a op p.a; \
erg.b = b op p.b; \
return erg; \
}
// Hora de usar la macro con cada uno de los operadores.
SET_OP(+);
SET_OP(-);
SET_OP(*);
SET_OP(/);
/* Elimino el símbolo de la macro por si quiero usarla más
* adelnate con otros operadores u otro tipo de dato.
*/
#undef SET_OP
};
int main()
{
Num num1;
num1.a=1;
num1.b=75;
Num num2;
num2.a=150;
num2.b=175;
Num num1und2 = num1 + num2; // * Modificando acá el operador que cambie arriba la operación
cout << "num1und2 " << "a: " << num1und2.a << ", b: " << num1und2.b << endl;
return 0;
}