我正在尝试重载<<运算符使用友元函数,但由于某种原因它没有看到私有成员变量。任何想法为什么会发生这种情况会非常有帮助。
这是头文件
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;
}
答案 0 :(得分:5)
问题不在于Node
的可访问性,而在于其范围:非限定类型名称不会通过友谊变为范围 - 您应该使用Set::Node
代替。
list
变量也是如此:它应该是set.list
。
有了这两项变更,your code compiles fine on ideone。
答案 1 :(得分:1)
simplistic representation of your code 是:
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
,因此可以找到它
的 Working online sample 强>