现在,我正在一个项目中,非常需要两个类(A和B)之间的可转换性。我已经创建了一个函数myFunc(),该函数将A类的对象作为其参数,并将其传递给B类的对象。
我希望它起作用的原因是B可以隐式转换为整数,而A可以隐式构造为整数。我希望发生这两个过程,以便将B类的对象隐式转换为A类的对象。情况并非如此。
当我尝试将B类的对象传递给myFunc()时,出现错误:error: could not convert 'b' from 'B' to 'A'
。
但是,有趣的是,我可以传入我显式转换为整数的B类对象,或传入以B类对象作为参数的A类显式构造对象。似乎在一行中只能发生一个隐式进程(无论是转换构造函数还是隐式转换)。为什么会这样呢?有什么办法可以解决这个问题?
我知道一个简单的解决方案是在A中创建一个将B类对象作为其参数的构造函数,或者在B中创建一个将B类对象转换为A类对象的运算符。我的目的是,除非绝对必要,否则不应使用这些解决方案。
我仍在学习C ++(我来自Java)。希望下面的代码可以阐明我在说什么。感谢您的提前反馈。
#include <iostream>
// objects of class A can be (implicitly) constructed with an int
struct A {
A(int) {}
};
// objects of class B can be (implicitly) converted to an int
struct B {
B(int) {}
operator int() { return 0; }
};
// myFunc takes an object of class A
void myFunc(A)
{ }
// why can't myFunc convert the argument b like the following: B -> int -> A?
int main()
{
B b(5);
// These work:
myFunc((int) b);
myFunc(A(b));
// This does not:
myFunc(b);
}
注意:上面的代码应正确编译,直到myFunc(b);
被注释掉为止。
答案 0 :(得分:1)
您要查找的内容在C ++中称为转换序列。要从一种类型转换为另一种类型,只能执行有限数量的步骤。重要的是,每种可能的类别中最多只能有一个步骤。例如。您最多可以进行一次数字升迁(例如short
至long
。)。重要的是,在您的示例中,最多可以有一个用户定义的转化。 是转换构造函数(Foo::Foo(Bar)
)或是转换函数({{1} }。您的示例同时需要。