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

我正在用C ++编写一个矩阵运算的小型矩阵库。 然而,我的编译器抱怨,之前没有。 这段代码放置在书架上6个月,之间我将计算机从debian etch升级到lenny(g ++(Debian 4.3.2-1.1)4.3.2),但是我在Ubuntu系统上使用相同的g ++ 。

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

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 ++又变得有些生疏了。 :-)


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


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

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>这样的模板参数。


要添加Mehrdad答案,

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;
 }
链接地址: http://www.djcxy.com/p/73099.html

上一篇: How to properly overload the << operator for an ostream?

下一篇: Operator[][] overload