我的ostream和istream friend功能无法访问私人班级成员

时间:2015-09-25 15:16:45

标签: c++ matrix friend-function

我的代码:

matrix.h

#include <iostream>

class Matrix {
private:
    int row;
    int col;
    int **array;

public:
    Matrix();
    friend std::ostream& operator<<(ostream& output, const Matrix& m);
};

matrix.cpp

#include "matrix.h"
#include <iostream>

Matrix::Matrix()
{
    row = 3;
    col = 4;

    array = new int*[row];

    for (int i = 0; i < row; ++i)
    {
        array[i] = new int[col];
    }

    for (int i = 0; i < row; ++i)
    {
        for (int j = 0; j < col; ++j)
        {
            array[i][j] = 0;
        }
    }
}

std::ostream& operator<<(std::ostream& output, const Matrix& m)
{
    output << "\nDisplay elements of Matrix: " << std::endl;

    for (int i = 0; i < m.row; ++i)
    {
        for (int j = 0; j < m.col; ++j)
        {
            output << m.array[i][j] << " ";
        }
        output << std::endl;
    }

    return output;
}

的main.cpp

#include "matrix.h"
#include <iostream>
using namespace std;

int main()
{
    Matrix a;
    cout << "Matrix a: " << a << endl;

    system("pause");
    return 0;
}

错误:

  1. member&#34; Matrix :: row&#34; (在第3行matrix.h&#34;中声明)无法访问
  2. 会员&#34; Matrix :: col&#34; (在第3行matrix.h&#34;中声明)无法访问
  3. member&#34; Matrix :: array&#34; (在第3行matrix.h&#34;中声明)无法访问
  4. 二进制&#39;&lt;&lt;&# :找不到哪个运算符采用类型&#39; 类型的右手操作数
  5. &#39; ostream&#39;:模棱两可的符号
  6. &#39; istream&#39 ;:模棱两可的符号
  7. 我做错了什么? :(

    **编辑:我编写了一个问题来提供像Barry建议的MCVE示例,并且还删除了像using namespace std一样的建议。我仍然得到同样的错误。

2 个答案:

答案 0 :(得分:2)

现在你有一个完整的例子,你在这里遗漏了std::

friend std::ostream& operator<<(ostream& output, const Matrix& m);
                              ^^^

添加它,一切都编译良好:

friend std::ostream& operator<<(std::ostream& output, const Matrix& m);

答案 1 :(得分:1)

  

我做错了什么? :(

将语句using namespace std;放入标题是一种不好的做法,这是有原因的。根据这个:

  

'ostream':暧昧的符号   'istream':模棱两可的符号

你在某个地方的全局命名空间中声明了istream和ostream。遵循良好做法,输入std::

并不困难