如何正确重载 ostream 的 << 运算符?

新手上路,请多包涵

我正在用 C++ 编写一个用于矩阵运算的小型矩阵库。但是我的编译器抱怨,以前没有。这段代码被搁置了 6 个月,在这期间我将计算机从 debian etch 升级到 lenny (g++ (Debian 4.3.2-1.1) 4.3.2 ) 但是我在具有相同 g++ 的 Ubuntu 系统上遇到了同样的问题.

这是我的矩阵类的相关部分:

 namespace Math
{
    class Matrix
    {
    public:

        [...]

        friend std::ostream& operator<< (std::ostream& stream, const Matrix& matrix);
    }
}

和“实施”:

 using namespace Math;

std::ostream& Matrix::operator <<(std::ostream& stream, const Matrix& matrix) {

    [...]

}

这是编译器给出的错误:

matrix.cpp:459: error: ‘std::ostream& Math::Matrix::operator<<(std::ostream&, const Math::Matrix&)’ 必须只取一个参数

我对这个错误有点困惑,但是在这 6 个月里做了很多 Java 之后,我的 C++ 又变得有点生疏了。 :-)

原文由 Matthias van der Vlies 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 664
2 个回答

您已将函数声明为 friend 。它不是班级的成员。您应该从实现中删除 Matrix::friend 表示指定的函数(不是类的成员)可以访问私有成员变量。您实现该功能的方式就像 Matrix 类的实例方法,这是错误的。

原文由 mmx 发布,翻译遵循 CC BY-SA 2.5 许可协议

只是告诉你另一种可能性:我喜欢为此使用朋友定义:

 namespace Math
{
    class Matrix
    {
    public:

        [...]

        friend std::ostream& operator<< (std::ostream& stream, const Matrix& matrix) {
            [...]
        }
    };
}

该函数将自动定位到周围的命名空间 Math (即使它的定义出现在该类的范围内)但除非您使用 Matrix 对象调用 operator<< ,否则它将不可见,这将使参数依赖查找找到该运算符定义。这有时可以帮助模棱两可的调用,因为它对于 Matrix 以外的参数类型是不可见的。在编写其定义时,您还可以直接引用 Matrix 中定义的名称和 Matrix 本身,而无需使用一些可能很长的前缀来限定名称并提供模板参数,例如 Math::Matrix<TypeA, N>

原文由 Johannes Schaub - litb 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题