La cosa e' abbastanza subdola, ma anche ovvia:
il costruttore 'Dummy(Dummy&)' puo' essere utilizzate ALL'INTERNO della funzione 'DoSomething'.
Invece TU stai tentando di utilizzarlo ALL'ESTERNO della suddetta funzione, infatti sei all'INTERNO del 'main'!
Dove sta' l'inghippo: sta' ne; fatto che hai definito la funzione come 'void DoSomething(Dummy ob)', cioe' ob deve essere passato per VALORE e NON per REFERENCE, QUINDI il compilatore TENTA di usare il costruttore di copia per creare una COPIA di o1 da mettere sullo stack PRIMA di chiamare la funzione!
Infatti, cosi' il compilatore compila senza problemi (che poi il programma non abbia senso, e' un'altra questione):
#include <iostream>
using namespace std;
class Dummy {
private:
Dummy(Dummy &source) {}
public:
Dummy(int value) {}
friend void DoSomething(Dummy ob);
};
void DoSomething(Dummy ob) {
cout << "I'm here!" << endl;
Dummy o2(321);
DoSomething(o2);
}
int main(void) {
Dummy o1(123);
//DoSomething(o1);
return 0;
}