ISO C ++禁止声明没有类型的“东西”

时间:2013-09-07 07:32:33

标签: c++ templates

我是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'

3 个答案:

答案 0 :(得分: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 :
....
};

 ....

答案 1 :(得分:2)

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

除此之外,请移除using namespace stdit is bad in general, and very bad in headers

#ifndef LIST_H
#define LIST_H

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

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

#endif // LIST_H

答案 2 :(得分: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 {
    // ...
};

顺便提一下header is considered a bad practice中的using namespace std;