C++ 在C+中显式转换为本机类型+;

C++ 在C+中显式转换为本机类型+;,c++,operator-overloading,C++,Operator Overloading,我正在尝试为不支持long的编译器编写一个实现64位int的类,以便在现有代码中使用。基本上,我应该能够在某个地方有一个typedef,它可以选择我是想使用long还是我的类,其他的一切都应该编译并工作 因此,我显然需要来自int、long等的转换构造函数,以及相应的转换运算符(强制转换)到这些类型。这似乎会导致算术运算符出错。对于本机类型,编译器“知道”当调用operator*(int,char)时,它应该将char提升为int,并调用operator*(int,int)(而不是将int强制转

我正在尝试为不支持
long
的编译器编写一个实现64位int的类,以便在现有代码中使用。基本上,我应该能够在某个地方有一个typedef,它可以选择我是想使用
long
还是我的类,其他的一切都应该编译并工作

因此,我显然需要来自
int
long
等的转换构造函数,以及相应的转换运算符(强制转换)到这些类型。这似乎会导致算术运算符出错。对于本机类型,编译器“知道”当调用
operator*(int,char)
时,它应该将
char
提升为
int
,并调用
operator*(int,int)
(而不是将
int
强制转换为
char
)。在我的例子中,各种内置操作符和我创建的操作符之间会产生混淆

在我看来,如果我能以某种方式将转换运算符标记为显式的,它将解决这个问题,但据我所知,
explicit
关键字仅适用于构造函数(我不能为内置类型生成构造函数)

那么有没有办法将强制转换标记为显式的呢?还是我找错了方向,有别的办法解决这个问题?或者我只是做错了什么

编辑:

对我想做的事情做一点澄清:我有一个项目,在很多地方使用64位(‘long-long’)操作,我正试图将它移植到一个不支持64位变量/操作的平台上。尽管我有这个项目的源代码,但我真的不想去查看内置操作符和C样式转换所在的数千个地方,并对它们进行更改

至于代码本身,本项目有以下定义和代码类型:

typedef long long i64;  // I would like to only have to change this to use my class instead of "long long"

int a;
unsigned b;
int c = ((i64)a*b)>>32;
关于类实现,我有以下几点:

class Long64 {
public:

Long64();
Long64(const Long64&);
Long64(int);
Long64(long);
Long64(unsigned int);
Long64(unsigned long);

operator int() const;
operator long() const;
operator unsigned int() const;
operator unsigned long() const;

friend Long64 operator*(int l, const Long64& r);
friend Long64 operator*(const Long64& l, int r);
friend Long64 operator*(long l, const Long64& r);
friend Long64 operator*(const Long64& l, long r);
}

您应该使用有意义的名称而不是转换运算符来创建方法-例如
toLongLong()
而不是
operator long()
-这样您就能够编写人们和编译器都容易理解的代码。这是唯一合理的解决方案,因为您有太多的转换运算符,甚至编译器都无法得到您想要的。

为了避免编译器混淆,您可以通过为所有算术运算符定义类和内置类型的组合来帮助它。例如,对于运算符+,您需要定义+未签名的运算符

MyClass operator+(char, MyClass const&);
MyClass operator+(MyClass const&, char);
MyClass operator+(short, MyClass const&);
MyClass operator+(MyClass const&,short);
MyClass operator+(MyClass const&,int);
编译器更喜欢不需要使用转换运算符的重载

当然,所有这些方法都将使用重载 MyClass运算符+(MyClass常量&,MyClass常量&)

通过显式地将其中一个参数转换为类MyClass

MyClass operator+(char c, MyClass const& m) { return MyClass(c)+m;}

我知道这有点麻烦,但应该避免冲突

允许在C++的下一个版本中使用转换运算符使用<代码>显式< /代码>,但不是当前的。你能发一些代码吗?通常的建议是避免太多的隐式转换,但要提供(例如)
to_int()
样式的函数,但您确实需要发布代码来演示您遇到的实际问题。为了帮助您,我需要您显示您在类中定义的运算符签名。但这样一来,它就不会取代本机类型,并且需要对使用它的代码进行更改,这正是我试图避免的。我会用我到底想做什么来澄清这个问题。@Tal Pressman:我明白你的问题,但你在这里做不了什么-要么你的代码看起来很干净,但需要很多思考才能理解,要么你只是为了更好的未来而更改类和调用代码。这就是我所做的,但是我错过了未签名的重载/谢谢。