gpt4 book ai didi

c++ - 转换运算符和函数查找的问题

转载 作者:行者123 更新时间:2023-11-30 04:03:57 24 4
gpt4 key购买 nike

我有一个类,我们称它为 Wrapper,它包装了给定的类型,比如说 MyClass。实际上,Wrapper 是一个类模板,但我认为这与这里无关。

Wrapper 通过转换运算符(仅供阅读)公开包装的 MyClass

当我为 MyClass 创建一个运算符作为自由函数(在我的示例中是一元减号运算符)时,这按预期工作,我也可以在 Wrapper 类。

但是,如果我将运算符实现为成员函数,编译器会报错:错误:‘operator-’不匹配

我认为自由函数和成员函数在这种情况下是等价的,为什么不呢?

有没有办法改变成员运算符或 MyClass 工作的 Wrapper 类?

如果没有,这是否表明将运算符实现为自由函数而不是成员函数通常更可取?

下面是一些代码来说明这个问题。

struct MyClass {
// This doesn't work:
void operator-() const {}
};

// It works with this instead of the member operator:
//void operator-(const MyClass&) {}

struct Wrapper {
operator MyClass() const { return MyClass(); }
};

int main() {
-Wrapper();
}

这是一个活生生的例子:http://ideone.com/nY6JzR

最佳答案

问题 我认为在这种情况下自由函数和成员函数是等价的,为什么不呢?

回答

为了使 -Wrapper() 正常工作,编译器必须查找 operator-。它在默认命名空间、类 Wrapper 和定义 Wrapper 的命名空间中查找名称 operator-。它不会查看名称的其他类和命名空间。

这解释了当 operator-() 被移动到 MyClass 时的编译器错误,以及为什么当它被定义为非成员函数时它会成功。

问题有没有办法改变成员运算符或MyClass工作的Wrapper类?

回答有两种方法可以解决这个问题。

  1. MyClass 非成员函数创建运算符函数。

  2. MyClassWrapper 中创建运算符函数,Wrapper 中的实现是简单的传递函数。这样做的好处是,您不必关心 MyClass 中的运算符函数是成员函数还是非成员函数。

问题 如果没有,这是否表明将运算符实现为自由函数而不是成员函数通常更可取?

答案 这可以是基于您对上一个答案所做的选择的政策决定。

关于c++ - 转换运算符和函数查找的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24020132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com