Por que é complexo * int não definido em C ++?
-
10-07-2019 - |
Pergunta
A C ++ programa
#include <complex>
#include <iostream>
int main()
{
std::complex<double> z(0,2);
int n = 3;
std::cout << z * n << std::endl;
}
produz um erro: não é páreo para ‘operador *’ em ‘z * n’. Por quê?
Estou compilar com g ++ 4.4.1. Talvez o compilador está apenas seguindo o C ++ padrão, caso em que a minha pergunta é: por que a norma não permitir que este
Solução
Isso funciona:
#include <complex>
#include <iostream>
int main()
{
std::complex<double> z(0,2);
double n = 3.0; // Note, double
std::cout << z * n << std::endl;
}
Porque complexo é composto por quartos duplos, ele se multiplica com duplos. Olhando para a declaração:
template <typename T>
inline complex<T> operator*(const complex<T>&, const T&);
(O seguinte é graças a dribeas ) O compilador não tem permissão para fazer conversões de tipo implícito durante dedução modelo, assim que passando uma complex
com T sendo double
, e depois outro T sendo int
, ao tentar corresponder a função de tratar T como double
faz com que a segunda argumento para mis-jogo, e vice-versa.
Por que você quer para o trabalho, ele teria que ter uma função definida semelhante a esta:
template <typename T, typename U>
inline std::complex<T> operator*(std::complex<T> lhs, const U& rhs)
{
return lhs *= rhs;
}
que permite que a função para tirar tipos diferentes, o que permite que o elenco a ser feito ao chamar operator*=
.
Outras dicas
operadores de std::complex<T>
são definidos para tomar como seus argumentos outras instâncias complex<T>
. A rota a partir de um int
através de um double
a um complex<double>
é apenas marginalmente muito contorcido / complicado para a linguagem C ++ para segui-lo de acordo com o padrão (e com as enormes complicações já decorrentes de conversões e cohercions roda livre é difícil criticar que aspecto da norma). Eu acho que o caso super-especial de complex<double>
permitindo int
s uncasted como operandos para seus operadores só não foi considerado suficientemente frequente e importante para justificar especificando especializações modelo para esse caso extremamente indivíduo, considerando como trivialmente é fácil para o programador para lançar o int
para double
quando isso é o que eles realmente deseja -!)