c++ - 运算符未解析为运算符函数 c++

标签 c++ visual-studio operator-overloading

我一直在处理需要重载某些运算符的类(=、==、+、!= 等)我编写了运算符函数,但有时它们没有被调用,或者编译器就像它根本不存在一样。 例如:

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/

相关文章:

c++ - 为什么在设置类成员时会自动从 const 转换为 non-const &?

c++ - 在 void 函数的末尾有一个空的 return 语句的原因吗?

c++ - 内容处置文件名中的特殊字符

visual-studio - 受身份验证保护的 nuget.server

c# - 在 Azure DevOps 中运行时,.Net/VS 测试运行器失败

visual-studio - 我可以不用鼠标快速调出 VS IDE 的字体大小吗?

c++ - 无法在模板 .h 中声明 2 个 friend 重载<<

c++ - 二进制搜索陷入无限循环?

c++ - 重载赋值运算符,用于将 sql::ResultSet 赋值给 struct tm

Lua 覆盖 # 字符串