C ++ 11 назначение копирования для std :: complex в g ++ 4.5 - нет совпадения для 'operator +' - PullRequest
6 голосов
/ 12 декабря 2011

Приведенный ниже код не может быть скомпилирован с g ++ версии 4.5.0 с использованием ключа -std=c++0x.Я получаю следующее сообщение об ошибке:

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'

Я считаю, что это относится к упомянутому требованию Назначаемое здесь .Должен ли я определить свой собственный оператор присваивания копии для сложных?Если да, то как?

#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;
}

1 Ответ

11 голосов
/ 12 декабря 2011

[cmplx.over] / p3 определяет дополнительные перегрузки для pow, когда задействовано complex:

Шаблон функции pow должен иметь дополнительные перегрузки, достаточные для обеспечения, при вызове по крайней мере с вызовомодин аргумент типа complex<T>:

  1. Если любой из аргументов имеет тип complex<long double> или тип long double, то оба аргумента эффективно приводятся к complex<long double>.

  2. В противном случае, если какой-либо из аргументов имеет тип complex<double>, double или целочисленный тип, оба аргумента эффективно приводятся к complex<double>.

  3. В противном случае, если какой-либо из аргументов имеет тип complex<float> или float, оба аргумента фактически приводятся к complex<float>.

Значение 2 повышается до двойного,и pow(complex<float>, double) возвращает complex<double>.

...