问题
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:
- member "Matrix::row" (declared at line 3 matrix.h") is inaccessible
- member "Matrix::col" (declared at line 3 matrix.h") is inaccessible
- member "Matrix::array" (declared at line 3 matrix.h") is inaccessible
- binary '<<' : no operator found which takes a right-hand operand of type 'Matrix'
- 'ostream': ambiguous symbol
- '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