我有一个类,我们称它为 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
类?
回答有两种方法可以解决这个问题。
为
MyClass
非成员函数创建运算符函数。在
MyClass
和Wrapper
中创建运算符函数,Wrapper
中的实现是简单的传递函数。这样做的好处是,您不必关心MyClass
中的运算符函数是成员函数还是非成员函数。
问题 如果没有,这是否表明将运算符实现为自由函数而不是成员函数通常更可取?
答案 这可以是基于您对上一个答案所做的选择的政策决定。
关于c++ - 转换运算符和函数查找的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24020132/