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

标签 c++ type-conversion

我有一个类,我们称它为 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/

相关文章:

Java泛型,在方法调用期间定义类型

c++ - 具有类型转换的多态复制构造函数

c++ - c++ 中的直方图代码显示了一些疯狂的意外数字

c++ - 调整二维变量C++的大小

C++ 如何动态创建二维 vector

sql - 将数值转换为数据类型数值时出现算术溢出错误

c++ - 在 C++ 中为函数和类使用多个文件

c++ - 如何在 Windows 上eekg() 超过 4GB 的文件?

asp.net-mvc - 在 databasefirst mvc 中使用枚举作为下拉列表

c++ - 如何检查从 C++ 字符串到 unsigned int 的转换