Penso che l'errore dipenda dal fatto che hai definito l'operatore nel file header cosicchè viene di fatto definito più volte, tante volte qunte includi l'header. Quindi sposta la definizione nel file .cpp e nell'header metti anche le direttive

#ifned EXPRE_H
#define EXPRE_H

come ho fatto io:

file Expr.h:

codice:
#ifndef EXPR_H
#define EXPR_H

#include <ostream>
#include <iostream>

using namespace std;
class Expr
{
//...
public:
	// Costruttore senza parametri
	Expr();
//...
	friend ostream &operator<<(ostream& stream, Expr expression);
};


#endif
file Expr.cpp

codice:
#include "Expr.h"

Expr::Expr(){
	
}

// Overloading dell'operatore <<
// Inseritore
ostream &operator<<(ostream &stream, Expr expression)
{
	stream << "CIAOOO" << endl;
	return stream;
}
File main.cpp

codice:
#include <iostream>
#include "Expr.h"

using namespace std;

int main()
{
	cout << Expr();
	return 0;
}
Il tutto funziona con MinGW, ma dovrebbe anche con VC,