如何正确重载<操作符的ostream?

如何正确重载<操作符的ostream?

我正在用C+为矩阵操作编写一个小的矩阵库。然而,我的编译器抱怨说,以前它没有。这段代码在货架上放置了6个月,在此期间,我将我的计算机从Debian蚀刻升级到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) {

    [...]}

这是编译器给出的错误:

矩阵cpp:459:错误:‘std:ostream&Math:Matrix:运算符<(std:ostream&,Const Math:Matrix&)’必须使用一个参数

我对这个错误感到有点困惑,但是我的C+在做了6个月的大量Java之后又有点生疏了。*-)


慕仙森
浏览 610回答 3
3回答

HUWWW

你已经宣布你的职能是friend..它不是班上的一员。你应该把Matrix::从实施。friend意味着指定的函数(它不是类的成员)可以访问私有成员变量。实现该函数的方式类似于Matrix这是错误的。

紫衣仙女

我只想告诉你另一种可能性:我喜欢用朋友的定义:namespace&nbsp;Math{ &nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;Matrix &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[...] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;friend&nbsp;std::ostream&&nbsp;operator<<&nbsp;(std::ostream&&nbsp;stream,&nbsp;const&nbsp;Matrix&&nbsp;matrix)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[...] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;};}该函数将自动定位到周围的命名空间中。Math(即使它的定义出现在该类的范围内),但除非您调用运算符<with一个矩阵对象(这将使参数依赖查找),否则它将不可见,请查找该运算符定义。这有时可以帮助处理不明确的调用,因为它对于矩阵以外的参数类型是不可见的。在编写其定义时,您还可以直接引用矩阵中定义的名称和矩阵本身,而无需使用一些可能的长前缀对名称进行限定,并提供如下模板参数Math::Matrix<TypeA, N>.

梦里花落0921

namespace Math{     class Matrix     {        public:        [...]     }        std::ostream& operator<< (std::ostream& stream, const Math::Matrix& matrix);}在你的实现中std::ostream& operator<<(std::ostream& stream,                       const Math::Matrix& matrix) {     matrix.print(stream); //assuming you define print for matrix      return stream;  }
打开App,查看更多内容
随时随地看视频慕课网APP