class apple
{
public :
operator orange () const { cout << "operator"; }
} ;
class orange
{
public :
orange (apple &x ){cout <<"constructor";}
};
void f(orange o)
{
cout <<"function can accept only oranges ";
}
int main()
{
apple a;
f(a);
}
输出: 编译器错误
为什么这段代码会给g ++编译器带来编译错误?当函数f被调用时,为什么不调用橙色的构造函数?
答案 0 :(得分:4)
你有一个循环依赖:
class apple
{
public :
operator orange () const { cout << "operator"; } //depends on orange
//shouldn't compile
} ;
class orange
{
public :
orange (apple &x ){cout <<"constructor";} //depends on apple
};
我很惊讶你没有收到编译器错误。无论如何,您需要在定义orange
之前定义apple
,并且不需要运算符orange
:
class apple;
class orange
{
public :
orange (apple &x ){cout <<"constructor";}
};
class apple
{
public :
};
这应该有用。
答案 1 :(得分:2)
您的operator orange()
不会返回任何值。转换运算符的所有要点是将您的实例从类型A转换为类型B.
您应该创建一个橙色实例并将其返回。 (虽然我真的没有看到将苹果变成橙色的感觉:))