我一直在处理需要重载某些运算符的类(=、==、+、!= 等)我编写了运算符函数,但有时它们没有被调用,或者编译器就像它根本不存在一样。 例如:
class Thing{
public:
Thing& operator=(const Thing& _other){
// implementation
}
bool operator==(const Thing& _other){
// implementation
}
Thing& operator+(const Thing& _other){
// implementation
}
};
这包括类的其他成员函数(构造函数(默认)、构造函数(复制)、析构函数等),但有时该方法会被忽略。
void Foo(Thing & thing1, Thing & thing2){
//snip
if(thing1 == thing2){
//do some stuff
}
//snip
Thing tempThing();
thing1 = thing2 + &tempThing;
//snip
}
在 Visual-Studio 中我去编译,它发现没有运算符接受 Thing 的左侧参数,然后如果我指定 thing2->operator+(&tempThing);
然后它工作这是令人困惑的,因为它应该仅仅依靠语言解析来解析那个运算符函数
如果存在 Class operator#(Class)
函数,并且可以将参数转换为适当的类型,那么只需使用该运算符,编译器就会将其替换为运算符函数,或者至少调用运算符函数。
thing1 = thing2 + thing3; // written line
thing1.operator=(thing2.operator+(thing3));
为什么我必须指定运算符函数。编译器不应该为我这样做吗?
编辑:这是一个关于一般行为的问题,而不是代码的实际正确性。即使当我出于某种原因编写语句时,它们也必须指定实际的 operator() 而不是只能使用符号。 (我不得不用直接的例子来做到这一点,以及为字符复制字符,但有时它确实有效)
最佳答案
Thing tempThing();
这可能不是您所想的那样。谷歌“最令人烦恼的解析”。
thing1 = thing2 + &tempThing;
由于您的operator+
采用引用(而不是指针),因此您不想采用地址。修正前面的定义后,它应该可以正常编译为 thing1 = thing2 + tempThing;
。
但是,一般来说,您希望避免使用成员函数来重载大多数运算符。问题在于这样做允许将右操作数转换为正确的类型,但不能将左操作数转换为正确的类型。通过使用全局重载,您可以获得对称性——可以转换任一操作数。
关于c++ - 运算符未解析为运算符函数 c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9679185/