我有一系列类型,我希望它们可以自由转换。考虑以下玩具示例:
struct A {
int value;
A(int v) : value(v) { }
};
struct B {
int value;
B(int v) : value(v) { }
B(A a) : value(a.value) { }
operator A() const { return A(value); }
};
struct C {
int value;
C(int v) : value(v) { }
C(A a) : value(a.value) { }
C(B b) : value(b.value) { }
operator B() const { return B(value); }
operator A() const { return A(B(*this)); } // <-- ambiguous
};
int main(int argc, const char** argv) {
C c(5);
A a(3);
a = c;
}
如您所见,我试图将每个后续类型定义为可以使用强制转换构造函数从所有先前的类型转换,并可以使用强制转换运算符转换为所有先前的类型。唉,这不能按预期工作,因为C::operator A
根据 gcc 4.7 的定义是不明确的:
In member function ‘C::operator A() const’:
19:40: error: call of overloaded ‘B(const C&)’ is ambiguous
19:40: note: candidates are:
9:3: note: B::B(A)
6:8: note: constexpr B::B(const B&)
6:8: note: constexpr B::B(B&&)
将表达式更改为static_cast<A>(static_cast<B>(*this))
不会改变任何事情。完全删除该行会导致 中的错误消息main
,因为没有隐式转换序列可以使用多个用户定义的转换。在我的玩具示例中,我可以直接执行 fromC
到 to的转换A
,但在我的实际应用程序中,这样做会导致大量重复代码,所以我真的想要一个重用其他转换运算符的解决方案。
那么如何在不复制转换代码的情况下获得一组三种可自由转换的类型呢?