c++ error2019 高手进!

来源:百度知道 编辑:UC知道 时间:2024/06/30 08:07:52
/*Stack.h*/
#ifndef STACK_H
#define STACK_H

template<typename T>
class Stack
{
public:

Stack(int =10);

~Stack()
{
delete []stackPtr;
}

bool push(const T&);
bool pop(T&);

bool isFull()const
{
return top==size-1;
}

bool isEmpty()const
{
return top==-1;
}

private:
int size;
int top;
T *stackPtr;
};
#endif
/////////////////////////////////////////////////////////////
/*Stack.cpp*/
#include"Stack.h"

template<typename T>
Stack<T>::Stack(int s)
:size(s>0 ? s:10),
top(-1),
stackPtr(new T[size])
{
}

template<typename T>
bool Stack<T>::push(const T& pushValue)
{
if(!isFull())
{
stackPtr[++top]=pushValue;
return true;
}

return false;
}

这是由C++的编译器造成的。前一阵子真研究这个问题。
使用模板类,C++提供了两种方式,分离模式和包含模式,我想你在书上应该已经看到过了,你这种写法就是分离模式。
但是目前的编译器似乎对分离模式都没有很好的支持,包括VC6.0,VS2005,DEVC++,GCC(我都试过了)。
解决办法:
包含模式
使用包含模式,将H和CPP中内容都写到CPP中,摒弃H文件。
分离模式
1直接在main中包含CPP文件,(其实跟包含模式一个原理)
2在H中include CPP文件,(网络传闻,我没有成功)
还有其他的方法,可以到我空间上看看,虽然说得很简单不过还是有解决办法的。

原因:
C++是一种静态语言,需要在编译时确定所使用的数据类型,但是模板类(就同他的名字一样)不是一个类型,只是一个模板,只有在确定其类型参数后,它才真正成为一个类型。所以在你链接程序时,你的连接器无法找到一个Stack<double>的类型,固然报错。
这里只是简述,想详细了解可以到网上搜索《c++模板类编译过程》类似的文章看看。

补充:
to lihaosky123:
你自己去找编译原理看看,你在后目标文件中的是Stack还是Stack<double>。
在链接时,目标文件根本不知道类型参数是什么,怎么来给你产生数据类型。

这个的确有问题,我在linux下生成了目标文件,连接时出现错误:
main.cpp:(.text+0x62): undefined reference to `Stack<double>::Stack()'
main.cpp:(.text+0x95): undefined reference to `Stack<double>::pop(double&)'
另外不用inlude"stack.cpp“,楼上瞎说,目标文件中可以找到,你在。h里定义的函数,不知为什么,期待中。。。。

你的main函数CPP文件里少了一个调用: #include&quo