Добавление двойных и комплексных чисел в C ++

Рассмотрим этот бит кода:

#include <iostream>
#include <complex>

int main()
{
  std::complex<double> z1 = 5;
  std::cout << z1 - 1 << "\n";  // must change to z1 - 1.0 to compile

  std::complex<int> z2 = 5;
  std::cout << z2 - 1.0 << "\n";  // must change to z2 - 1 to compile
}

Это приводит к ошибке компиляции, поскольку operator- не найдено для типов в выражениях z1 - 1 или z2 - 1.0. С другой стороны, изменение этих выражений так, чтобы базовые типы соответствовали, работает нормально.

Наивно, для z1 - 1 я ожидал бы int 1, который будет повышен до double, и ожидается z2, с базовым типом int, в z2 - 1.0 для повышения до complex<double>. Что происходит?

c++
7 голосов | спросил bcf 5 J0000006Europe/Moscow 2015, 03:02:08

2 ответа


0

operator- вы пытаетесь вызвать шаблон функции с параметром шаблона одного типа.

template< class T >
complex<T> operator-( const complex<T>& lhs, const T& rhs);

Ни один из параметров шаблона в двух параметрах функции не отображается в не выводимом контексте, поэтому вычитание аргумента шаблона выполняется для обоих параметров по отдельности, что приводит к T для lhs выводится как double, а для rhs выводится как int.

Из-за этого несоответствия между выведенными типами вывод аргументов шаблона завершается неудачно, и ваш код не компилируется.

ответил Praetorian 5 J0000006Europe/Moscow 2015, 03:14:50
0

Компилятор не будет автоматически преобразовывать типы из A в B в C, если A является целым числом, а B является плавающей точкой. Вы хотите, чтобы компилятор преобразовал из int -> double -> complex<double>, но этого не произойдет.

Для второго примера вам нужно повысить complex<int> до complex<double>, который не обрабатывается автоматически шаблоном класса complex.

ответил rlbond 5 J0000006Europe/Moscow 2015, 03:13:11

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132