为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
慕仙森 2019-06-28 10:15:43
如何正确重载<操作符的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之后又有点生疏了。*-)
查看完整描述

3 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

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


查看完整回答
反对 回复 2019-06-28
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

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

namespace Math{
    class Matrix
    {
    public:

        [...]

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

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


查看完整回答
反对 回复 2019-06-28
?
梦里花落0921

TA贡献1772条经验 获得超6个赞


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;
 }


查看完整回答
反对 回复 2019-06-28
  • 3 回答
  • 0 关注
  • 609 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信