Хобрук: Ваш путь к мастерству в программировании

почему здесь не работает приведение типов?

Следующий код имеет ошибку приведения типа

#define IMG_I (std::complex<double>(0, 1))
#define PI 3.1415926535
for (unsigned long int j = 0; j < 10; ++j)
  std::cout << exp(-IMG_I * PI * j);

Приведение типов можно легко решить, используя дополнительные скобки или изменяя порядок умножения. Но мне непонятно, почему вообще возникает проблема приведения типов и почему С++ не может обрабатывать приведенный выше код как есть.

кто-нибудь может объяснить это для меня?

23.02.2011

  • Как насчет того, чтобы указать ошибку, которую вы получаете. Я подозреваю, что у компилятора могут быть проблемы с '-(std::complex‹double›(0, 1))', но трудно сказать без сообщения об ошибке 23.02.2011
  • Почему бы просто не использовать const std::complex<double> IMG_I(0, 1);? 23.02.2011
  • Ваши макросы скрывают часть вашего неявного приведения к несовместимым типам... 23.02.2011
  • О чем ты говоришь? В этом коде нет приведения типов. 23.02.2011
  • @rob-kennedy успокойся Роб 24.02.2011

Ответы:


1

Эта перегрузка operator* для std::complex представляет собой шаблон функции с объявлением, которое выглядит так:

template<typename T> 
complex<T> operator*(const complex<T>& lhs, const T& val); 

T в complex<T> для аргумента lhs должно совпадать с T для аргумента val, чтобы вывод аргумента шаблона работал.

Вы пытаетесь вызвать его с помощью std::complex<double> (тип -IMG_I * PI) и unsigned long (тип j). double и unsigned long не относятся к одному и тому же типу, поэтому вывод аргумента шаблона невозможен.

-IMG_I * (PI * j) работает, потому что тип PI * j — это double, поэтому нет никакой двусмысленности относительно того, что такое T. Аналогично, -IMG_I * PI * static_cast<double>(j) работает по той же причине.

23.02.2011
  • хотел бы я поставить +2 за static_cast<double>(j) 23.02.2011

  • 2

    Если вы посмотрите на заголовочный файл, определяющий комплекс:

    template
    inline complex<_Tp>
    operator*(const complex<_Tp>& __x, const _Tp& __y)
    {
    complex<_Tp> __r = __x;
    __r *= __y;
    return __r;
    }

    Вы увидите, что вместо _Tp (в данном случае double) вторым параметром является const _Tp&. Это означает, что C++ не желает выполнять неявное приведение из целого числа j, отсюда и ошибка.

    Если бы второй параметр был переписан как _Tp, встроенное в C++ неявное преобразование типов преобразовало бы целое число в двойное, и ваш код скомпилировался бы.

    23.02.2011
  • Это неверно: если бы у нас не было ошибки вывода аргумента (скажем, если бы параметры были типа complex<T> и U), временный double был бы создан из unsigned long и этот временный мог быть передан operator*. Только если параметр является неконстантной ссылкой (T& вместо const T&), он не может быть привязан к временной. 23.02.2011
  • Новые материалы

    Как симулировать серию пенальти на Python с помощью симуляции Монте-Карло, часть 1: генерация функций
    Серия пенальти была огромным испытанием во время чемпионата мира по футболу. Они вызвали много споров в социальных сетях и новостных агентствах. Даже финальный матч турнира решался по..

    AST для разработчиков JavaScript
    TL; DR Эта статья - мое выступление на недавно состоявшейся конференции Stockholm ReactJS Meetup. Вы можете посмотреть слайды здесь..

    5 проектов на Python, которые нужно создать прямо сейчас!
    Добро пожаловать! Python — один из моих любимых языков программирования. Если вы новичок в этом языке, перейдите по ссылке ниже, чтобы узнать о нем больше:

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..