My ostream and istream friend function can't access private class members

强颜欢笑 提交于 2019-12-13 08:31:55

问题


My code:

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

Error:

  1. member "Matrix::row" (declared at line 3 matrix.h") is inaccessible
  2. member "Matrix::col" (declared at line 3 matrix.h") is inaccessible
  3. member "Matrix::array" (declared at line 3 matrix.h") is inaccessible
  4. binary '<<' : no operator found which takes a right-hand operand of type 'Matrix'
  5. 'ostream': ambiguous symbol
  6. 'istream': ambiguous symbol

What am I doing wrong? :(

**Edited: I've editted the question to give a MCVE example like Barry suggested, and also removed using namespace std like Slava recommended. I'm still getting the same error.


回答1:


Now that you have a complete example, you're missing std:: here:

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

Add it and everything compiles fine:

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



回答2:


What am I doing wrong? :(

It is a bad practice to put statement using namespace std; into header, and there is a reason for that. According to this:

'ostream': ambiguous symbol 'istream': ambiguous symbol

You have istream and ostream declared in global namespace somewhere. Follow good practice, it is not so difficult to type std::



来源:https://stackoverflow.com/questions/32785411/my-ostream-and-istream-friend-function-cant-access-private-class-members

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!