考虑以下示例:
struct m
{
m(int ) { }
};
class q
{
public:
int i;
q(int i)
{
this->i = i;
}
operator double()
{
return (double) i;
}
operator m()
{
return (m)i;
}
};
int main()
{
q x(1);
(m)x; // error: ambiguous
}
当我调用转换时失败:从 q
到 m
的转换不明确。为什么这样?我真的不明白。我明确地为 m
添加了一个转换运算符!为什么要模棱两可?但是,如果我删除对 double
的强制转换,这将起作用。为什么这很重要?我怎样才能做我想做的事?
最佳答案
考虑编译器在执行时可能采用的路径:
m temp__(x);
相关的构造函数有3个:
m(int ); // (A)
m(const m& ); // (B)
m(m&& ); // (C)
我们可以通过x --> double --> int
调用(A)
,这是一个用户定义的转换序列。
我们可以通过x --> m
调用(B)
或(C)
,这也是一个用户自定义的转换序列.
如果用户定义的转换序列最终调用相同的构造函数,那么它们只能优先于另一个。但在这种情况下,它们不会 - 因此编译器无法偏爱其中一个。因此,模棱两可。
你的替代方案是
- 直接调用您的运算符(operator)(或使其成为具有某个名称的函数);或
- 使
q
继承自m
- 派生到基础的转换将优于用户定义的转换序列;或 - 使两个转换运算符都
显式
- 在这种情况下,只有一个可行的候选开始,所以不会有歧义。
关于c++ - 类型转换运算符总是模棱两可,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30695523/