gpt4 book ai didi

c++ - 可相互转换的类型和不明确的调用

转载 作者:行者123 更新时间:2023-11-28 03:23:13 25 4
gpt4 key购买 nike

我有一系列类型,我希望可以自由地相互转换。考虑以下玩具示例:

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;
}

如您所见,我尝试将每个后续类型定义为可使用强制转换构造函数从所有先前类型转换,并可使用强制转换运算符转换为所有先前类型。 las,这不能按预期工作,正如 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 中出现错误消息,因为没有隐式转换序列可以使用多个用户定义的转换。在我的玩具示例中,我可以从 C 执行转换至 A直接,但在我的实际应用程序中,这样做会导致大量重复代码,所以我真的很想要一个重用其他转换运算符的解决方案。

那么如何在不复制转换代码的情况下获得一组三个可自由相互转换的类型呢?

最佳答案

我会在结构 C 中尝试这种方式:

operator A() const { return this->operator B(); }

关于c++ - 可相互转换的类型和不明确的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14854888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com