自定义类的隐式类型促销订单

时间:2014-11-24 04:47:08

标签: c++ type-conversion

我正在编写一个类,我想允许转换到各种其他类,包括内置类型。我有一个隐含的转换优先顺序,但我不知道如何表达它。当类型不匹配时,这会导致模糊的方法重载。例如:

class Foo
{
public:
    Foo(int x) : m(x) {}
    operator int() const { return m; }
    Foo operator+(const Foo& foo) const { return Foo(m + foo.m); }
private:
    int m;
};

鉴于上述类定义,表达式Foo(3) + 7导致编译错误, Foo :: operator +:2重载具有类似的转换。我知道这是因为编译器不知道我是要将Foo转换为int,还是从Foo构建一个临时int。我如何指定我总是希望构建一个临时Foo

更一般地说,如果我还要同时定义Foo::Foo(Bar)Bar::Bar(Foo),如果我调用Foo(3) + Bar(7)我将总是想要一个临时的Bar,我将如何指定从Foo构建?

更新以澄清我的要求:

  1. 两个转换方向都必须存在。所以以下内容仍然必须编译:

    int i = 3; Foo foo(i); float a[4]; a[foo];

  2. 我不想明确指定首选演员表(例如通过致电Foo(3) + static_cast<Foo>(7))。

  3. 我不想为运算符和操作数类型的每个排列定义重载(例如Foo::operator+(int))。我希望依靠隐式转换为Foo,后跟Foo::operator___(Foo)

1 个答案:

答案 0 :(得分:1)

C ++语言无法指定隐式转换优先顺序,我无法找到满足您所有要求的任何方式。

此处的最佳解决方案是移除您的operator int()。我知道你说你不想要那个替代品,但是当你第一次写这个时,调用.get()只有六个字符的输入,一次。然后它不仅可以解决您的歧义,还可以防止由于隐式转换为int而产生的模糊错误。这些是你盯着代码两天的错误(假装你两年后维护你的代码)并且仍然无法看到错误,因为你没有意识到隐含的转换已被使用。