ISO C++禁止声明没有类型的"something"

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

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

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 :
....
};

 ....

2
这段话的意思是,你需要在 List 的类模板定义之前放置 Node 的类模板定义,或者在 List 之前进行前向声明 NodeList 类模板需要知道存在一个 Node 类模板。
另外,顺便提一下,最好不要使用 using namespace std,因为它通常是不好的做法,在头文件中使用更是非常糟糕的做法。
#ifndef LIST_H
#define LIST_H

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

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

#endif // LIST_H

1

在声明List时,编译器不知道Node类模板,因此你需要先进行Node类的前向声明:

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

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

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

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

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

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

顺便提一下,在编程中,在头文件中使用 using namespace std; 被认为是不好的做法

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接