奇怪的类重新定义错误

时间:2014-11-12 22:49:22

标签: c++ templates

我有一个奇怪的错误,说我的课程正在重新定义,源于我的Node类中的朋友声明。这是我目前的代码:

template <class T>
class Node {

private:

    T val;
    Node<T> * next;

public:

    friend class OList;

};

我的其他课程:

template <class T>
class OList {  ------> Error here

private:

    Node<T> * head;
    int size;

public:

    OList();
    OList(const OList<T> &b);
    ~OList();

    clear();
    int size();
    T tGet(int input);
    int count(T input);
    insert (T input);
    remove (T input);
    uniquify(T input);
    Node<T> * returnHead();

};

// Constructs empty list
template <class T>
OList<T>::OList() { ---> Error here
    head = NULL;
    size = 0;
}

2 个答案:

答案 0 :(得分:8)

OList不是类,它是类模板。您可以与模板的所有特化相匹配:

template <typename> friend class OList;

或朋友具体专业化:

friend class OList<T>;

将要求OList已声明。在Node

的定义之前提出前瞻性声明
template <typename> class OList;

答案 1 :(得分:0)

此外,朋友声明不能引用局部专业化。

来源:https://en.cppreference.com/w/cpp/language/friend