Search code examples
c++matrixfriend-function

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


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.


Solution

  • 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);