C++ 使用转换运算符创建类对象 #包括 #包括 使用名称空间std; 阶级情结 { 私人: 双实数; 双imag; 公众: //默认构造函数 复数(双r=0.0,双i=0.0):实(r),imag(i) {} //量值:通常的函数样式 双磁 { 返回getMag(); } //幅值:转换运算符 运算符int() { 返回getMag(); } 私人: //类帮助器来获取大小 双getMag() { 返回sqrt(real*real+imag*imag); } }; int main() { //复杂物体 复杂com(3.0,4.0); //印刷量 cout

C++ 使用转换运算符创建类对象 #包括 #包括 使用名称空间std; 阶级情结 { 私人: 双实数; 双imag; 公众: //默认构造函数 复数(双r=0.0,双i=0.0):实(r),imag(i) {} //量值:通常的函数样式 双磁 { 返回getMag(); } //幅值:转换运算符 运算符int() { 返回getMag(); } 私人: //类帮助器来获取大小 双getMag() { 返回sqrt(real*real+imag*imag); } }; int main() { //复杂物体 复杂com(3.0,4.0); //印刷量 cout,c++,C++,您已将转换运算符声明为int。由于此运算符不显式,因此编译器在查找ostream::operator的最佳重载时,会考虑编译器是否尝试转换为cout定义了重载的类型。 如果它可以转换为2种类型,并且cout定义了重载,则会出现编译错误。 如果将此函数添加到类中,则不会编译代码: explicit operator int() { return getMag(); } 要解决这个问题,您必须进行这样的转换: // magnitude : conversion operator oper

您已将转换运算符声明为
int
。由于此运算符不显式,因此编译器在查找
ostream::operator的最佳重载时,会考虑编译器是否尝试转换为cout定义了重载的类型。
如果它可以转换为2种类型,并且cout定义了重载,则会出现编译错误。
如果将此函数添加到类中,则不会编译代码:

explicit operator int() {
     return getMag();
}
要解决这个问题,您必须进行这样的转换:

// magnitude : conversion operator
operator float ()
{
    return getMag() + 1;
}
//也可以这样做

cout“我不明白编译器是如何解决调用cout的转换运算符的问题的。在
cout
的标准头中查找它可以打印的所有标准类型。然后意识到它将检查每个类型,直到找到匹配项。这是您的类提供的。”我还可以有多个转换运算符然后编译器将发出“歧义”错误(如果没有单个转换被认为是“最佳的”)这是否意味着当
cout
ing对象时,编译器会寻找到内置数据类型的转换运算符,
int
float
char
,等等。如果转换运算符要转换到某个不同类的对象呢?那么它会抛出错误吗?@Inasecord正如我所说的,为什么不读取头
iostreamm
并亲自查看哪些类型为
cout
定义了转换?@InaseCoder No,它不寻找到“内置数据类型”的转换。就像在任何其他重载解析中一样,它收集
操作符的所有声明是的,我的意思是允许,但“一个不能定义重载的类型”这是一个很好的定义。我将编辑我的答案。
// magnitude : conversion operator
operator float ()
{
    return getMag() + 1;
}
// same can be done like this
cout << "Com: " << (float) com << endl;