我是c ++的初学者所以请原谅我,如果我的错误在下面变得愚蠢。尽管如此,我仍然坚持使用我的代码,并希望得到任何帮助。
尝试通过make via g ++编译时出现以下错误:
In file included from A.cpp:2:
List.h:20: error: ‘List’ is not a template type
A.cpp: In member function ‘void A::NowyObiekt(int)’:
A.cpp:6: error: ‘list_a’ was not declared in this scope
make: *** [A.o] Error 1
我的代码分为以下 tiny 文件:
A.cpp:下面
#include "A.h"
#include "List.h"
void A::NewObject(int i)
{
list_a.Add(i);
}
int A::Compare(int a, int b)
{
if ( a>b ) return 1;
if ( a<b ) return -1;
else return 0;
}
List.h:下面(标题)
#ifndef LIST_H
#define LIST_H
template<typename T>
class Node
{
Node()
{
nxt = pre = 0;
}
Node(const T& el, Node *n = 0, Node *p = 0 )
{
dana = el; nxt = n; pre = p;
}
T dana;
Node *nxt, *pre;
};
template<typename T>
class List
{
public:
List()
{
head = tail = 0;
}
void Add(const T&);
protected:
Node<T> *head,*tail;
};
#endif
List.cpp:http://pastebin.com/a3HQ9yZ4
prog.cpp:下面(主要)
#include "List.h"
#include "A.h"
int main()
{
int i = 5;
class List list_a;
class A obj;
obj.Add(i);
}
,makefile为:http://pastebin.com/GTR5jW54
如上所述,我仍然是初学者,所以请理解。我会感谢任何帮助和明确的解释。提前谢谢。
答案 0 :(得分:4)
您的代码存在一些问题:第一个问题是您没有在任何地方声明任何名为list_a
的变量。那个错误应该很明显。另一个是您使用List
类而不给它模板参数。
最后一个关于你的问题的小记:由于你的文件确实非常小,你可以将它们放在问题中而不是链接到它们。
修改:关于List
模板问题。
您已在Node
中正确使用List
,即将节点声明为Node<T>
。使用List
时,您只需执行相同操作即可。例如,要声明一个整数列表:
List<int> my_int_list;
此外,由于您只使用来自班级List
的{{1}}中的公共函数,因此您不需要A
声明。如果您做需要使用受保护或私有成员(IMO是设计不良的标志),您还需要将该朋友声明模板化:
friend
最后,你的代码无论如何都不会编译......原因是当你使用模板类时,必须完全定义整个类(即完成其函数实现)。您可以通过将函数放在头文件中来解决此问题。在定义函数时,您还需要模板参数:
friend class List<sometype>;
请注意,我在几个地方添加了模板参数。