Почему комплекс <удваиваются> * интервал, не определенный в C++?

У Facebook есть несколько классных инженерных головоломок, которые мне нравятся, но они могут быть немного продвинутыми, чтобы только начать. Я - так себе программист C ++, поэтому я решил головоломки сначала в Python, а затем в C ++.

Ознакомьтесь с: Пазлы Facebook Engineering

В них, кажется, есть все: от простого (Hors d'oeuvre) до довольно сложного (Buffet).

Я полагаю, что эти головоломки были созданы для вербовки, но сами по себе они веселые. (Может быть, я немного отвратительный?)

Плюс, у них есть дополнительное преимущество: никогда не знаешь, когда тебе может понадобиться работа.

10
задан PeeHaa 5 September 2012 в 14:02
поделиться

2 ответа

Это работает:

#include <complex>
#include <iostream>

int main()
{
    std::complex<double> z(0,2);
    double n = 3.0; // Note, double
    std::cout << z * n << std::endl;
}

Поскольку комплекс состоит из удвоений, он умножается на удвоения. Посмотрите на объявление:

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

(Следующее спасибо dribeas ) Компилятору не разрешено выполнять неявное преобразование типов во время вывода шаблона, поэтому, передав комплекс с ] T double , а затем другой T , являющийся int , при попытке сопоставить функцию, обрабатывающую T как ] double приводит к неправильному совпадению второго аргумента, и наоборот.

Для того, что вы хотите работать, должна быть определена функция, подобная этой:

template <typename T, typename U>
inline std::complex<T> operator*(std::complex<T> lhs, const U& rhs)
{
    return lhs *= rhs;
}

Что позволяет функции принимать различных типов, что позволяет выполнять приведение при вызове оператора * = .

14
ответ дан 3 December 2019 в 22:00
поделиться

std :: complex определены, чтобы принимать в качестве аргументов другие экземпляры complex . Маршрут от int через double к сложному немного слишком искажен / запутан для языка C ++, чтобы следовать ему в соответствии со стандартом (и с огромными сложностями, уже возникающими из-за произвольных преобразований и когерций, трудно критиковать этот аспект стандарта). Я предполагаю, что суперсобычный случай сложного , разрешающий некастированные int s в качестве операндов для своих операторов, просто не считался частым и достаточно важным, чтобы гарантировать указание специализаций шаблонов для этого чрезвычайно индивидуального кейс,

2
ответ дан 3 December 2019 в 22:00
поделиться
Другие вопросы по тегам:

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