2

我正在尝试使用友元函数重载 << 运算符,但由于某种原因它没有看到私有成员变量。任何为什么会发生这种情况的想法都会很有帮助。

这是头文件

    class Set
    {
private:
    struct Node
    {
        int val;
        Node* link;
    };

    Node *cons(int x, Node *p);
    Node *list;


public:
    Set() {list = NULL;}
    bool isEmpty() const;
    int size() const;
    bool member (int x) const;
    bool insert (int x);
    bool remove (int x);
    void print() const;
    const Set operator+(const Set &otherSet)const;
    const Set operator*(const Set &otherSet)const;
    Node* getSet()const{return list;}
    void setList(Node *list);
    friend ostream& operator <<(ostream& outputStream, const Set &set);
    };

这是函数定义。

    ostream& operator <<(ostream& outputStream, const Set &set)
    {
              Node *p;
              p = list;
              outputStream << '{';
              while(p->link != NULL)
              {
                outputStream << p->val;
                p = p->link;
              }
              outputStream << '}';
              return outputStream;
    }
4

2 回答 2

5

问题不在于可访问性,Node而在于其范围:非限定类型名称不会通过友谊进入范围 - 您应该Set::Node改用。

变量也是如此list:它应该是set.list.

有了这两个更改,您的代码可以在 ideone 上正常编译

于 2012-11-22T03:52:23.890 回答
1

您的代码的简单表示是:

class A
{
    struct MY
    {
        int a;
    };
    friend void doSomething(A);
};

void doSomething(A)
{
    MY *b;

}
int main()
{
    return 0;
}

问题在于:

MY *b;

您的函数无法理解 的类型,MY因为它是在类中声明的A。因此错误:

In function 'void doSomething(A)':
Line 12: error: 'MY' was not declared in this scope
compilation terminated due to -Wfatal-errors.

为了告诉函数在My里面找到A你需要使用结构的完全限定名

A::MY *b;

一旦你这样做了,该函数就知道在哪里寻找MY,因此可以找到它。
工作在线样本

于 2012-11-22T03:56:41.750 回答