3

我是 C++ 模板编程的新手,所以我决定从编写模板列表开始。Node<T> *head;我在线收到此错误Node<T> *tail;

这是我的头文件(因为错误只出现在那里):

#ifndef LIST_H
#define LIST_H

using namespace std;

template <class T> class List {

public:
    List();
    T get(const int n);
    void add(const T element);
private:
    Node<T> *head;
    Node<T> *tail;
    int size;
};

template <class T> class Node {
public :
    Node();
    T get();
    void setNext(const Node<T> *next);
    Node<T> getNext();
    void setValue(const T value);
private:
   T value;
   Node *next;
};

#endif // LIST_H

哦,我typename之前尝试过添加Node<T>,但它给了我expected nested-name-specifier before 'Node'

4

3 回答 3

5

将您的Node定义放在前面List或前面声明Node

template <class T> class Node;  // forward declaration for Node

template <class T> class List {    
public:
    List();
    T get(const int n); 
    void add(const T element);
....
};


template <class T> class Node {
public :
....
};

 ....
于 2013-09-07T07:35:00.480 回答
2

这只是意味着您必须将Node类模板定义放在 of 之前List,或者Node在之前声明ListList类模板需要知道类模板的存在Node

顺便说一句,删除using namespace std它通常很糟糕,并且在 headers 中非常糟糕

#ifndef LIST_H
#define LIST_H

template <class T> class Node { /* as before */ };

template <class T> class List { /* as before };

#endif // LIST_H
于 2013-09-07T07:33:31.020 回答
1

您必须在声明之前对Node类模板进行前向声明,List因为在List声明期间,编译器不知道Node该类:

template <class T> class Node;  // Forward declaration

template <class T> class List {
    // ...
};

template <class T> class Node{
    // ...
};

甚至你可以Node在之前声明你的类List

template <class T> class Node{
    // ...
};

template <class T> class List {
    // ...
};

顺便说一句,using namespace std;标头中被认为是一种不好的做法

于 2013-09-07T07:37:33.633 回答