从友元函数访问静态成员函数

时间:2014-11-16 00:09:41

标签: c++ operator-overloading friend

我使用链表来实现set类。为了从用户隐藏我的struct Node,我将struct Node声明置于私有中。此外,我重载了operator +,它表示两组之间的联合操作。因为我想通过递归来实现它,所以我在名为unionMerge的私有字段中重载了operator +。但是,它产生了一个错误“错误:'unionMerge'未在此范围内声明”,但我确实将unionMerge声明放在了set.cpp文件中的operator +之上。有人可以帮助我吗?

Set.h是一个接口文件。 Set.cpp是接口的实现。

这是接口文件,Set.h:

#ifndef SET_H
#define SET_H
#include <iostream>
using namespace std;
class Set{
    public:
    Set();
    friend const Set operator+(const Set& a, const Set& b);
    private:
    struct Node{ //private Node
        int value;
        Node* next;
    };

    Set(Node *p); //private constructor
    Node* list;

    //overload the public operator+ above
    static Node* unionMerge(const Node* p, const Node *q);
};
#endif

这是实现文件Set.cpp:

#include <iostream>
#include "Set.h"

Set::Set():list(nullptr){
}

Set::Set(Node* p){
    list = p;
}

Set::Node* Set::unionMerge(const Node *p, const Node *q){
    // to debug, I return nullptr 
    return nullptr;
}

const Set operator+(const Set& a, const Set& b){

//error: ‘unionMerge’ was not declared in this scope

     return Set(unionMerge(a.list,b.list));

    Set::Node *p = unionMerge(a.list,b.list);  
    Set s;
    s.list = p;
    return s;
}

1 个答案:

答案 0 :(得分:3)

operator+()不是Set的成员(朋友不是成员),因此如果您想访问Set的静态成员,则必须符合条件:

 return Set(Set::unionMerge(a.list,b.list));