template <class T, class U>
auto operator * (const matrix<T>& A, const matrix<U>& B)
-> matrix<decltype( std::declval<T>() * std::declval<U>() )>

ってTがcomplex<float>, Uがcomplex<U>のときにうまくいかないみたい

ttp://stackoverflow.com/questions/16865376/idiomatic-c11-type-promotion
に書いてあることと同じ現象が発生するわ