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++?