会员无法使用好友功能

时间:2013-12-17 20:13:09

标签: 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& 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
}

在这里我的定义是:

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

它给了我Matrixh成员无法访问的错误,但我明确表示他们是朋友的功能。

3 个答案:

答案 0 :(得分:2)

你的函数实现也应该驻留在project命名空间中 - 只是声明你正在使用它是不够的,如果你不指定它那么函数本身就是'全局'然后不会能够访问成员,因为它是在错误的命名空间范围内。

Compiles fine with this fix

Does not compile otherwise

答案 1 :(得分:0)

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

答案 2 :(得分:0)

尝试在Matrix类之外定义两个朋友函数。

喜欢:

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