Hola:
 
Parece que el error se refiera a que la función que sobrecarga << no tenga acceso a los miembros privados de la clase.¿Puede ser que le quitaras la declaración de 
friend? 
Te pongo un ejemplo que debería de funcionarte, a ver si puedes detectar el error 
 
Fichero h:    
Código C++:
Ver original#ifndef RACIONAL_H
#define RACIONAL_H
 
#include <iostream>
 
using namespace std;
 
class Racional
{
public:
    Racional():Num(1),Den(1) {}
    Racional(long numerador, long denominador):Num(numerador),Den(denominador) {}
    Racional(const Racional& copia);
    long int LeeNum()const{return Num;}
    long int LeeDen()const{return Den;}
 
 
    friend ostream& operator<< (ostream& stream, const Racional& elem);
 
private:
 
    long int Num;
    long int Den;
    long int mcd(long a, long b);
};
 
 
#endif // RACIONAL_H
  
Fichero cpp:   
Código C++:
Ver original#include "../include/Racional.h"
 
ostream& operator<< (ostream& stream, const Racional& elem)
{
    stream << elem.Num << "/" << elem.Den; //necesito friend para usar Num y Den q son privados
    return stream;
}
  
Un main para ver si funciona la cosa 
    
Código C++:
Ver original#include "./include/Racional.h"
 
int main()
{
    Racional valor;
    cout<<valor.LeeNum()<<endl;
    cout<<valor.LeeDen()<<endl;
    cout<<valor<<endl;
    Racional valor2(10,20);
    cout<<valor2<<endl;
    return 0;
}
  
Respecto a la cláusula const, si defines la función como:   
Lo que le estás diciendo es que retorne un 
const long. Como Num es del tipo 
long, pues se quejará. (no hay que confundir 
long con 
const long). C/C++ es un lenguaje fuertemente tipado y no pasa ni una 

 ) 
Para asegurarse de que la función no modifica el valor que lee, y que sólo lo devuelve, has de declararla así:   
(bueno, verás que el tipo es long int y que le he cambiado el nombre, pero igualmente:   
 
Saludos