Ciao, provo a vedere se si riesce a risolvere. Premetto che non conosco il metodo di Cardano, quindi il mio è un ragionamento che ha dei limiti.
Domanda: le soluzioni complesse le trovi solo alla fine o ti trovi ad operare con quantità immaginarie già durante l'applicazione dell'algoritmo?
Se il problema è che ti compare un numero complesso solo alla fine, quindi quando non devi più usarlo per altre operazioni, potresti fare un controllo con un if e, se la quantità sotto radice è negativa, cambi il segno e fai un cout andando ad inserire manualmente 'i' alla fine del tuo numero, es:
if(radicando<0){
soluzione=sqrt((-1)*radicando);
std::cout <<"La soluzione complessa è: " <<soluzione <<"i" <<std::endl;
}
Se invece ti trovi a dover compiere delle operazioni sulla quantità immaginaria questo metodo non penso funzioni, dovresti separare parte reale ed immaginaria. Scrivendolo in forma trigonometrica o esponenziale non migliora?
Ripeto, non conoscendo l'algoritmo di Cardano posso fare poco, spero però di averti dato qualche idea per risolvere