2011-12-12 9 views
6

El siguiente código no compila con la versión 4.5.0 de g ++ usando el modificador -std=c++0x. Me sale el siguiente mensaje de error:C++ 11 asignación de copia para std :: complex en g ++ 4.5 - no coincide con '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' 

creo que esto se relaciona con el requisito asignable mencionó here. ¿Debo definir mi propio operador de asignación de copias para complejo? ¿Si es así, cómo?

#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

El error, simplificado, dice "No hay operador + que tome un complejo y un complejo " – Cubbi

+0

@parapura rajkumar: Desafortunadamente no es así. – user2023370

+0

Esto compila en VS2010 quizás necesite la plantilla o la palabra clave typename. – AJG85

Respuesta

11

[cmplx.over]/p3 especifica sobrecargas adicionales para pow cuando complex está involucrado:

plantilla de función pow tendrá sobrecargas adicionales suficientes para asegurar , para una llamada con al menos un argumento tipo de complex<T>:

  1. Si alguno de los argumentos tiene el tipo complex<long double> o escriba long double, ambos argumentos se convierten efectivamente en complex<long double>.

  2. lo contrario, si cualquiera de los argumentos tiene el tipo complex<double>, double, o un tipo entero, entonces ambos argumentos se emitir eficazmente a complex<double>.

  3. De lo contrario, si cualquiera de los argumentos tiene el tipo complex<float> o float, ambos argumentos se convierten efectivamente en complex<float>.

El 2 se está promoviendo a un doble, y pow(complex<float>, double) devuelve un complex<double>.

+0

+1. Después de ver el error, estaba esperando esto. – Nawaz

+3

Detalles adicionales: la diferencia de C++ 03 se remonta a este informe de defectos: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#844 - eliminaron una sobrecarga adicional: plantilla complejo pow (complejo const & x, int y); – wolfgang

+1

Ya veo, gracias. En C++ 03, el mismo 'pow (x, 2)' devolvió un 'complejo ' en lugar de 'complejo '; y nunca ha habido un 'operator +' entre 'complex ' y 'complex '. – user2023370

Cuestiones relacionadas