C++ 自定义类的隐式类型提升顺序

C++ 自定义类的隐式类型提升顺序,c++,type-conversion,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:

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

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
,还是从
int
构造一个临时
Foo
。如何指定我总是希望构建一个临时的
Foo

更一般地说,如果我还想定义
Foo::Foo(Bar)
Bar::Bar(Foo)
,我如何指定如果我调用
Foo(3)+Bar(7)
,我将始终需要一个由
Foo
构造的临时
Bar

更新以澄清我的要求:

  • 两个转换方向都必须存在。因此,仍然必须编译以下内容:

    inti=3;富富(i),;浮动a[4];a[foo]

  • 我不希望必须明确指定首选强制转换(例如,通过调用
    Foo(3)+static_cast(7)

  • 我不想为运算符和操作数类型的每个排列定义重载(例如,
    Foo::operator+(int)
    )。我希望依赖于到
    Foo
    的隐式转换,然后是
    Foo::operator\uuuuuo(Foo)


  • < > C++语言无法指定隐式转换优先级顺序,我看不出满足您所有要求的任何方法。


    这里最好的解决方案是删除
    运算符int()
    。我知道你说过你不想要这个选择,但是调用
    .get()
    只需再键入六个字符,在你第一次编写它时只需要一次。然后,它不仅解决了您的模糊性,而且还可以防止由于隐式转换为int而产生的模糊错误。这些是您盯着代码看两天的错误类型(假设您在两年后维护代码)并且仍然看不到错误,因为您没有意识到已使用隐式转换。

    删除转换函数?@KerrekSB我仍然希望允许对不接受
    Foo
    的函数和运算符进行隐式下转换。例如,我希望
    myFloatArray[Foo(3)]
    仍然编译.OK。请编辑您的问题以明确您的所有要求。下一个选项是为
    operator+
    @KerrekSB更新的要求添加您自己的运算符重载-如果可能,我宁愿避免您的“下一个选项”。不允许任何隐式转换。他们是一个巨大的痛苦和造成无数难以找到的错误。C++最大的错误之一是,仅仅是你的推荐,还是真的没有办法实现我想要的C++?