c++多文件工程,我定义了函数,却只能编译不能组建通过。求解!

netstud99 2017-03-30 10:34:06

//Stack.h文件
#ifndef _Stack_H__
#define _Stack_H__
#include<iostream>
using namespace std;
template<class T,int MAXSIZE> //MAXSIZE是非类型参数,代表栈的容量大小
class Stack{
private:
T elems[MAXSIZE]; //elems数组用于存储栈的数据元素
int top; //栈顶指针
public:
Stack(){top=0;};
void push(T e); //入栈操作
T pop(); //出栈操作
bool empty(){return top==0;} //判断栈是否为空
bool full(){return top==MAXSIZE;} //判断栈是否满
};

#endif



//Stack.cpp文件
#include"stack.h"
template<class T,int MAXSIZE> //push成员函数的类外定义
void Stack< T, MAXSIZE>::push(T e)
{
if(top==MAXSIZE){
cout<<"栈已满,不能再加入元素了!";
return;
}
elems[top++]=e;
}
template<class T,int MAXSIZE> //pop成员函数的类外定义,指定为内联函数
inline T Stack<T, MAXSIZE>::pop()
{
if(top<=0){
cout<<"栈已空,不能再弹出元素了!"<<endl;
return 0;
}
top--;
return elems[top];
}


//main.cpp文件
#include"stack.h"
template<class T>
void display(Stack<T,10> &s)
{
while( !s.empty())
cout<<s.pop()<<"\t";
cout<<endl;
}
void main()
{
Stack<int,10> iStack;
cout<<"-------intStack----\n";
for(int i=1;i<10;i++)
iStack.push(i);
display(iStack);
}



此工程有3个文件,编译可以搞过,组建却提示错误:
Linking...
main.obj : error LNK2001: unresolved external symbol "public: void __thiscall Stack<int,10>::push(int)" (?push@?$Stack@H$09@@QAEXH@Z)
main.obj : error LNK2001: unresolved external symbol "public: int __thiscall Stack<int,10>::pop(void)" (?pop@?$Stack@H$09@@QAEHXZ)
Debug/main_stack_Template.exe : fatal error LNK1120: 2 unresolved externals
执行 link.exe 时出错.

求解!
...全文
276 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
棉猴 2017-04-01
  • 打赏
  • 举报
回复
《C++ Primer第4版》中提到,可以用两种方法来编译模板代码,一种叫做“包含编译模型”,另外一种叫做“分别编译模型”。“包含编译模型”就是在头文件的结尾处添加对cpp执行文件的包含 #include "stack.cpp" “分别编译模型”就是在cpp执行文件中,用export关键字声明该类模板的成员函数定义需要被导出 export template<class T,int MAXSIZE> template<class T,int MAXSIZE> //push成员函数的类外定义 void Stack< T, MAXSIZE>::push(T e) { if(top==MAXSIZE){ cout<<"栈已满,不能再加入元素了!"; return; } elems[top++]=e; }
棉猴 2017-04-01
  • 打赏
  • 举报
回复
用解决方法1或者解决方法2都可以
棉猴 2017-04-01
  • 打赏
  • 举报
回复
将模板类的声明和定义放在两个文件(h头文件和cpp执行文件)时,由于模板类的实现不是函数,因此cpp执行文件不能单独编译。也就是说,编译器不能通过h头文件来找到并且编译cpp执行文件。因此,在main.cpp中,编译器只能看到push()函数的声明,而看不到它的定义,所以回报error LNK2001: unresolved external symbol错误。 解决方法 1将函数的定义与函数的声明放在同一个文件中; 2在main.cpp的起始位置处添加#include "Stack.cpp",如下所示 #include"stack.h" #include "stack.cpp"
netstud99 2017-03-30
  • 打赏
  • 举报
回复
这就是说类模板的声明和定义只能在一个文件中?
netstud99 2017-03-30
  • 打赏
  • 举报
回复
有什么办法可以让声明和定义在2个不同文件中吗?比如我这样安排。
xskxzr 2017-03-30
  • 打赏
  • 举报
回复
你的模板定义在Stack.h和Stack.cpp组成的单元里,这个单元没有涉及main.cpp,因此定义没有实例化,所以链接器找不到。 解决办法就是模板的声明和定义不要分开。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧