Template class compilation “expected constructor, destructor, or type conversion before ‘<’ token” error
我在编译模板类时遇到问题。这是我的列表.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | using namespace std; template <class T> List<T>::List() { length = 0; } template <class T> List<T>::~List() { } template <class T> List<T> & List<T>::operator=(const List<T> & rhs) { List<T> hha; return hha; } template <class T> int List<T>::size() { return length; } |
这是我的单子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #ifndef _LIST_H_ #define _LIST_H_ #include <iterator> #include <ostream> using namespace std; template <class T> class List { private: class ListNode { public: ListNode(); ListNode(const T element); ListNode *next; T data; }; public: // big3 List(); ~List(); List<T> & operator=(const List<T> & rhs); int size(); bool empty(); void print(ostream & os) const; private: ListNode * head; ListNode * tail; int length; }; #include"list.cpp" #endif |
当我运行g++list.cpp时
我得到错误
"<"标记之前需要构造函数、析构函数或类型转换
对于构造函数、析构函数和运算符的定义…
我不知道怎么了
型
模板实现放在头中。
这是一个有点黑客,但它是如何做到的。
型
您当前遇到的问题是,您的
1 2 | #include"list.h" ... |
但是,这实际上会导致出现一个问题:如果您真的想将
顺便说一下,你使用的名字是不允许触摸的:从下划线开始的名字后面是大写字母,这是C++实现的,也就是编译器和标准库。在任何地方使用两个连续下划线的名称也被保留。
型
您编译
我看到你的表头有cpp。如果您将列表头包含在其他一些cpp文件中,并确保
我的意思是,文件main.cpp:
1 2 3 | #include"list.h" int main() {} |
号
然后用
通常,您只想在一起使用模板时避免使用cpp文件。把所有的东西都塞在头上,包括在内。或者我至少把你的
型
由于