2011-12-12 8 views
6

Il codice seguente non riesce a compilare con g ++ versione 4.5.0 utilizzando lo switch -std=c++0x. Ottengo il seguente messaggio di errore:C++ 11 assegnazione di copia per std :: complex in g ++ 4.5 - nessuna corrispondenza per 'operator +'

error: no match for 'operator+' in 'std::pow [with _Tp = float, _Up = int, typename __gnu_cxx::__promote_2<_Tp, _Up>::__type = double](((const std::complex<float>&)((const std::complex<float>*)(& x))), ((const int&)((const int*)(&2)))) + y' 

Credo che questo si riferisce al requisito assegnabile menzionato here. Devo definire il mio operatore di assegnazione delle copie per il complesso? Se é cosi, come?

#include <complex> 
using namespace std; 

int main(int argc, char *argv[]) { 
    complex<float> x,y; 
    x = pow(x,2);  // ok 
    x = x  + y; // ok 
    x = pow(x,2) + y; // error 
    return 0; 
} 
+2

L'errore, semplificato, dice "Non c'è operatore + che prende un complesso e un complesso " – Cubbi

+0

@parapura rajkumar: Sfortunatamente no. – user2023370

+0

Questo compila su VS2010 forse ha bisogno di una parola chiave template o typename. – AJG85

risposta

11

[cmplx.over]/p3 specifica sovraccarichi aggiuntivi per pow quando complex è coinvolto:

modello di funzione pow avrà sovraccarichi aggiuntive sufficienti per garantire , per una chiamata con almeno un argomento tipo di complex<T>:

  1. Se uno degli argomenti è di tipo complex<long double> o digitare long double, quindi entrambi gli argomenti vengono effettivamente convertiti in complex<long double>.

  2. Altrimenti, se uno degli argomenti è di tipo complex<double>, double, o di tipo intero, quindi entrambi gli argomenti sono effettivamente cast complex<double>.

  3. In caso contrario, se uno degli argomenti ha tipo complex<float> o float, entrambi gli argomenti vengono effettivamente convertiti in complex<float>.

Il 2 viene promosso a un doppio, e pow(complex<float>, double) restituisce un complex<double>.

+0

+1. Dopo aver visto l'errore, mi aspettavo questo. – Nawaz

+3

Ulteriori dettagli: La differenza rispetto a C++ 03 può essere ricondotta a questo rapporto sui difetti: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#844 - rimossi un sovraccarico aggiuntivo: modello complesso pow (const complex & x, int y); – wolfgang

+1

Vedo, grazie. In C++ 03 lo stesso 'pow (x, 2)' ha restituito un 'complesso ' invece di 'complesso '; e non c'è mai stato un 'operatore +' tra 'complesso ' e 'complesso '. – user2023370

Problemi correlati