【发布时间】:2020-03-15 17:27:08
【问题描述】:
为什么下面源码中没有对自定义类型进行隐式类型转换?
到类型 A 的隐式类型转换应该在注释行发生,但它没有发生,并且在该行发生错误。
我想知道这个错误的语法规则和解决方法。
#include <iostream>
using namespace std;
class A {
int v;
public:
A(int _v): v(_v) {}
operator int (void) const {
return v;
}
friend ostream& operator << (ostream& os, const A& s) {
return os << "A: " << s.v;
}
};
class B {
int x, y;
public:
B(int _x, int _y): x(_x), y(_y) {}
operator A(void) const {
return A(x+y);
}
};
int main(void)
{
B b(1,2);
cout << A(b) << endl;
cout << (A)b << endl;
cout << b << endl; // error --> why?
return 0;
}
--> 附加问题
感谢 Sam Varshavchik 的回复。
如下定义A类解决了这个问题。
class A {
int v;
public:
A(int _v): v(_v) {}
operator int (void) const {
return v;
}
friend ostream& operator << (ostream& os, const A& s);
};
ostream& operator << (ostream& os, const A& s){
return os << "A: " << s.v;
}
//////////////
class A {
int v;
public:
A(int _v): v(_v) {}
operator int (void) const {
return v;
}
friend ostream& operator << (ostream& os, const A& s){
return os << "A: " << s.v;
}
};
ostream& operator << (ostream& os, const A& s);
是否将“operator
【问题讨论】:
-
我知道你要去哪里了,你可能已经知道了,但是对于未来的读者,小心 C 风格的演员
(A)b。无论是否有意义,C 风格的演员都会以A威胁b。这里说得通。并非总是如此。这将是static_cast的好地方。static_cast确保演员阵容合理。 -
错误信息是什么?提示:它可能表示转换不明确。
-
我在实际开发过程中也使用了static_cast。希望看到这段代码的同学能记住user4581301的忠告。但是,如果您仍然不了解 static_cast,您可以跳过他的建议。此代码仅供初学者使用。
-
致Pete Becker:这不是由于转换模糊而导致的错误。感谢您的关注。
标签: c++ types implicit user-defined