为什么是复杂的<;双倍>;*int未在C+中定义+;? C++程序 #include <complex> #include <iostream> int main() { std::complex<double> z(0,2); int n = 3; std::cout << z * n << std::endl; } #包括 #包括 int main() { 配合物z(0,2); int n=3; std::cout

为什么是复杂的<;双倍>;*int未在C+中定义+;? C++程序 #include <complex> #include <iostream> int main() { std::complex<double> z(0,2); int n = 3; std::cout << z * n << std::endl; } #包括 #包括 int main() { 配合物z(0,2); int n=3; std::cout,c++,complex-numbers,C++,Complex Numbers,这项工作: #include <complex> #include <iostream> int main() { std::complex<double> z(0,2); double n = 3.0; // Note, double std::cout << z * n << std::endl; } 它允许函数采用不同的类型,允许在调用操作符*=std::complex时进行转换。定义的操作符将其他co

这项工作:

#include <complex>
#include <iostream>

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

它允许函数采用不同的类型,允许在调用
操作符*=

std::complex
时进行转换。定义的操作符将其他
complex
实例作为其参数。从
int
通过
double
complex
的路径就是marginaLY太扭曲/卷曲,C++语言遵循标准(并且伴随着巨大的并发症已经从自由的转换和连贯性中产生了,很难批评标准的这一方面)。.我想,
complex
允许未定式的
int
s作为其运算符的操作数的超级特例并不频繁,也不重要到足以保证为这种极端个别的情况指定模板专门化,考虑到程序员将
int
转换为
是多么简单>double
当他们真正想要的时候,我认为这是因为complex是一个类,而*对于该类是重载的,它不是一个原语,所以它不遵循编译器中的强制转换规则。hanks,我已经纠正了关于歧义的错误,以及我没有正确编写运算符的错误。(应该是第二个,但第一个对我来说是一个教训。)最初提供的操作员的执行不是错误的,只是可改进的(在一个常规的项目中,差别会很小)。对我来说,如果它是可以改进的,那是不对的。我通常会这样对我的操作员编码,所以我认为这是个错误。“编译器不允许在模板推导过程中进行隐式类型转换”是我错过的部分。所有参与的人,谢谢你的回答。-1:标准提供了对称自由函数,将std::complex乘以T。(C++03,26.2.6[lib.complex.ops]复杂的非成员操作)
template <typename T>
inline complex<T> operator*(const complex<T>&, const T&);
template <typename T, typename U>
inline std::complex<T> operator*(std::complex<T> lhs, const U& rhs)
{
    return lhs *= rhs;
}