Dipende. Se sommi una matrice di double a una matrice di int ottieni una matrice di double, idem se la moltiplichi. Se invece sommi o moltiplichi) una matrice di int a una di double rimarrai con una matrice di double. E lo stesso vale con std::complex.Originariamente inviato da RooccoXXI
ha perfettamente senso sommare una matrice di int a una di double o una di std::complex a una di double o di int.
Per farla breve con gli operatori che hai definito puoi solo operare su tipi omogenei.
Se vuoi operare con tipi non omogenei è necessario usare un altro sistema (metaprogrammazione template).
E' quello che ti avevo accennato tempo fa.
std::complex ha operatori matematici, ma non rientra nei tipi riconosciuti da std::is_arithmetic<>. Tuttavia è possibile farlo digerire allo static_assert usando un apposito traits:
codice:template <typename T> struct is_complex : public std::false_type {}; template <typename T> struct is_complex<std::complex<T>> : public std::true_type {}; static_assert(std::is_arithmetic<T>::value || is_complex<T>::value, "");

Rispondi quotando