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

Foi útil?

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 ints 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 -!)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top