c++ - 如果有一个关于流的 'overloading clash' 会发生什么?

标签 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 的更好或更常见的方法是什么 - 我是否应该为 运算符添加另一个重载>>SomeStream 中,需要一个 Something& 参数?或者我应该走相反的路,并在采用 SomeStreamSomething 中创建一个重载? (实际上不在 Something 中,而是作为一个全局函数,因为显而易见的原因)。

最佳答案

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

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

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

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

instanceOfSomeStream >> instanceOfSomething

将选择第一个重载,因为 SomeStreamistream 更派生。

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

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

关于c++ - 如果有一个关于流的 'overloading clash' 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26310096/

相关文章:

c++ - 如何将多个数字加到变量中

C++ 将流传递给类方法

windows - Windows 机器中的 dir/r 和输出流

c++ - 重载前增量和后增量

c++ - 运算符重载和迭代器混淆

c++ - 在没有类的情况下重载 operator-=

c++ - 我应该如何向开发人员提供库二进制文件?

c++ - 使用 CFileDialog 打开文件失败时如何捕获异常

c++ - 编译 SAX 打印示例 (xerces)

javascript - Node.js Readline 未写入输出文件