C++ 使用友元函数无法访问的成员

C++ 使用友元函数无法访问的成员,c++,C++,我犯了一个我无法解释的错误。这是我的头文件: #include <iostream> using namespace std; namespace project { #ifndef MATRIX_H #define MATRIX_H typedef int* IntArrayPtr; class Matrix { public: friend ostream& operator<<(ostream& out, const Matrix&

我犯了一个我无法解释的错误。这是我的头文件:

#include <iostream>
using namespace std;
namespace project
{
#ifndef MATRIX_H
#define MATRIX_H

typedef int* IntArrayPtr;
class Matrix
{
public:
    friend ostream& operator<<(ostream& out, const Matrix& object);
    friend istream& operator>>(istream& in, Matrix& theArray);
    //Default Constructor
    Matrix();

    Matrix(int max_number_rows, int max_number_cols, int intial_value);

    //Destructor
    ~Matrix();
    //Copy Constructor
    Matrix(const Matrix& right_side);
    //Assignment Operator
    Matrix& operator=(const Matrix& right_side);

    void Clear();
    int Rows();
    int Columns();
    bool GetCell(int x,int y, int& val);
    bool SetCell(int x,int y, int val);
    //void Debug(ostream& out);
private:
    int initialVal;
    int rows;
    int cols;
    IntArrayPtr *m;
};
#endif
}
#包括
使用名称空间std;
命名空间项目
{
#ifndef矩阵
#定义矩阵
typedef int*IntArrayPtr;
类矩阵
{
公众:
friend ostream&operator(istream&in,Matrix&theArray);
//默认构造函数
矩阵();
矩阵(整数最大数行、整数最大数列、整数初始值);
//析构函数
~Matrix();
//复制构造函数
矩阵(常数矩阵和右侧);
//赋值运算符
矩阵和运算符=(常数矩阵和右侧);
无效清除();
int行();
int列();
bool-GetCell(整数x、整数y、整数和值);
布尔设置单元(整数x,整数y,整数val);
//无效调试(ostream&out);
私人:
int initialVal;
int行;
int cols;
IntArrayPtr*m;
};
#恩迪夫
}
这里是我的定义:

ostream& operator<<(ostream& out, const Matrix& object)
{
    for(int r = 0; r < object.rows; r++)
    {
    for(int c = 0; c < object.cols; c++)
    {
        out << object.m[r][c] << " ";
    }
out << endl;
}
return out;
}

ostream&operator这些函数定义在哪里?
friend
声明将名称注入
命名空间项目
。如果函数未在该命名空间中定义,则它们是不同的函数,而不是朋友。

您的函数实现也应位于
项目
命名空间中-仅声明您正在使用它是不够的,如果不将函数本身指定为“全局”,则该函数本身是“全局”的,然后将无法访问成员,因为它在错误的命名空间作用域中是友好的


.

尝试在矩阵类之外定义两个友元函数

比如:

#include <iostream>
using namespace std;
namespace project
{
#ifndef MATRIX_H
#define MATRIX_H

typedef int* IntArrayPtr;
class Matrix
{
public:
    //Default Constructor
    Matrix();

    Matrix(int max_number_rows, int max_number_cols, int intial_value);

    //Destructor
    ~Matrix();
    //Copy Constructor
    Matrix(const Matrix& right_side);
    //Assignment Operator
    Matrix& operator=(const Matrix& right_side);

    void Clear();
    int Rows();
    int Columns();
    bool GetCell(int x,int y, int& val);
    bool SetCell(int x,int y, int val);
    //void Debug(ostream& out);
private:
    int initialVal;
    int rows;
    int cols;
    IntArrayPtr *m;
};
 ostream& operator<<(ostream& out, const Matrix& object);
 istream& operator>>(istream& in, Matrix& theArray);

#endif
}
#包括
使用名称空间std;
命名空间项目
{
#ifndef矩阵
#定义矩阵
typedef int*IntArrayPtr;
类矩阵
{
公众:
//默认构造函数
矩阵();
矩阵(整数最大数行、整数最大数列、整数初始值);
//析构函数
~Matrix();
//复制构造函数
矩阵(常数矩阵和右侧);
//赋值运算符
矩阵和运算符=(常数矩阵和右侧);
无效清除();
int行();
int列();
bool-GetCell(整数x、整数y、整数和值);
布尔设置单元(整数x,整数y,整数val);
//无效调试(ostream&out);
私人:
int initialVal;
int行;
int cols;
IntArrayPtr*m;
};
ostream&operator(istream&in、Matrix&theArray);
#恩迪夫
}

我敢打赌这是因为您没有将实现与标头中的类放在同一名称空间中。该定义是否在类中?dasblinkenlight是正确的。感谢所有的快速回复!它在我的实现文件matrix.cpp中定义。我在实现文件中声明了“使用名称空间项目;”
使用名称空间项目与定义名称空间内的函数不同。您必须将这些定义包装在
命名空间项目{…}
中。