2010-04-15 21 views
4

Le code suivant ne peut pas compilerMultipliant complexe avec constante en C++

#include <iostream> 
#include <cmath> 
#include <complex> 

using namespace std; 

int main(void) 
{ 
    const double b=3; 
    complex <double> i(0, 1), comp; 

    comp = b*i; 

    comp = 3*i; 

    return 0; 
} 

avec erreur: aucune correspondance pour « opérateur * » dans « 3 * i » Quel est le problème ici, pourquoi je ne peux pas multiplier avec constantes immédiates? b * je travaille.

Répondre

5

Dans la première ligne:

comp = b*i; 

Les appels du compilateur:

template<class T> complex<T> operator*(const T& val, const complex<T>& rhs); 

Ce qui est instancié comme:

template<> complex<double> operator*(const double& val, const complex<double>& rhs); 

Dans le second cas, il n'y a pas lieu modèle int, de sorte que l'instanciation échoue:

comp = 3.0 * i; // no operator*(int, complex<double>) 
4

Voir http://www.cplusplus.com/reference/std/complex/complex/operators/ pour un aperçu des opérateurs complexes.

Vous remarquerez que l'opérateur * est un modèle et utilisera le paramètre modèle de la classe complexe pour générer ce code. Le littéral numérique que vous utilisez pour appeler l'opérateur * est de type int. Utilisez comp = 3. * i;