2017-09-04 4 views
1

J'utilise la classe de vecteurs avec des nombres complexes et je dois multiplier un vecteur de nombres complexes avec un nombre complexe, comme celui-ci:Erreur: aucune correspondance pour 'opérateur *' (les types d'opérande sont 'std :: vecteur <std :: complexe <double>>' et 'std :: complexe <double>')

vector< complex<double> > vec; 
complex<double> z; 
// some initialization of vec and z ... 
vector< complex<double> > res; 
res = vec*z; // here is the error 

error: no match for ‘operator*’ (operand types are ‘std::vector<std::complex<double> >’ and ‘std::complex<double>’)

Est-il possible de surcharger l'opérateur * avec ces paramètres?

Répondre

2

Oui, c'est possible. Voici comment vous pouvez implémenter votre propre opérateur * pour complex<T>:

template <typename T> 
vector<complex<T>> operator *(const vector<complex<T>>& v, const complex<T> z) { 
    vector<complex<T>> res; 
    transform(v.begin(), v.end(), back_inserter(res), 
     [&](complex<T> x) -> complex<T> { 
      return x * z; 
     }); 
    return res; 
} 
+0

Merci, cela fonctionne exactement comment je en ai besoin. – Pekov

+2

J'ai modifié pour supprimer la barre de défilement. Question intéressante si c'est plus facile à lire qu'une version correctement formatée de 'vector > res (v); pour (auto & x: res) x * = z; return res; ', et quelles sont les caractéristiques de performance relative. –