如果出现“重载冲突”,会发生什么?关于溪流?

时间:2014-10-11 01:20:50

标签: c++ stream operator-overloading

假设我们有一个istream子类,使用以下方法:

SomeStream& operator>>(Something& something) {
    // .. write data into something
}

我们还有以下全局方法:

Something& operator>>(istream& stream, Something& something) {
    // .. write data from stream into something
}

C ++如何知道为以下代码调用哪个方法:

instanceOfSomeStream >> instanceOfSomething;

跟进问题:允许SomeStream写入Something的更好或更常见的方式是什么?我应该在operator>>中为SomeStream添加另一个重载吗?需要Something&参数?或者我应该采取相反的方式,并在Something中创建一个需要SomeStream的重载? (实际上不是Something,而是因为显而易见的原因而作为全局函数)。

1 个答案:

答案 0 :(得分:1)

C ++通常具有复杂的重载决策规则。在这种情况下,知道成员函数,为了重载解析的目的,行为就像一个非成员函数,它将对类的引用作为隐含的第一个参数, ie ,选择在[1]

之间
SomeStream& operator>>(SomeStream& somestream, Something& something)

Something& operator>>(istream& stream, Something& something)

当然,返回类型并不重要,对于

instanceOfSomeStream >> instanceOfSomething

将选择第一个重载,因为SomeStream的派生程度高于istream

您的后续问题应该是一个单独的问题。这里有一些可能相关的讨论:Should operator<< be implemented as a friend or as a member function?

[1]注意:我说&#34;像&#34;因为这不完全正确。例如,即使上面显示了左值引用,也可以在右值对象表达式上调用这样的成员函数。