我是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'
。
答案 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
之前转发声明List
。 List
类模板需要知道Node
类模板的存在。
除此之外,请移除using namespace std
,it 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;
。