大家好,欢迎来到IT知识分享网。
上一篇文章中是关于实习一个多功能计算器,计算表达式需要用到两个栈,一个存储表达式中的数字,一个存储表达式中的符号,刚刚好前面我也发过有关手动实现栈的文章,于是就想给大家看看手动栈在实际项目中的运用,可不曾想,使用类模板时错误连连,查了很多资料,这里总结一下~
类模板的定义
可用类模板来定义类,类模板是对象特性更为一般的抽象。简而言之,一个类模板就是一个抽象的类、类模板的一般定义形式为:
template<参数名列表>
class 类名{
//类的说明
};
其中,template是关键字,<参数名列表>中可以有多个参数,多个模板参数之间用逗号分隔。模板参数的形式可以是:
class<标识符> 或 类型表达式<标识符>
如,可定义栈的类模板如下:
template <class T>
class Stack
{
public:
Stack(int MaxStackSize = 100);
Stack<T>& Push(const T&x);
Stack<T>& Pop(T&x);
private:
int m_top;
int m_MaxSize;
T *m_stack;
};
易犯的错误
在C++中,用到类模板时,如果类似一般的类声明定义一样,把类声明放在.h文件中,而具体的函数定义放在.cpp文件中的话,会发现编译器会报错。如类似下面代码:
//Stack.h文件
#ifndef CXX_CALCULATOR_H
#define CXX_CALCULATOR_H
template <class T>
class Stack
{
public:
Stack(int MaxStackSize = 100);
Stack<T>& Push(const T&x);
Stack<T>& Pop(T&x);
private:
int m_top;
int m_MaxSize;
T *m_stack;
};
//Stack.cpp文件
template<class T>
Stack<T>::Stack(int MaxStackSize){
m_MaxSize = MaxStackSize-1;
m_stack = new T[MaxStackSize];
m_top = -1;
}
template<class T>
Stack<T>& Stack<T>::Push(const T& x){
if(IsFull()) {
printf("No memory\n");
return *this;
}
m_top = m_top + 1;
m_stack[m_top] = x;
return *this;
}
template<class T>
Stack<T>& Stack<T>::Pop(T& x){
if(IsEmpty()) {
printf("no element\n");
return *this;
}
x = m_stack[m_top];
m_top = m_top - 1;
return *this;
}
//main.cpp
#include <iostream>
#include "Stack.h"
using namespace std;
int main()
{
Stack<int> yuanyuan;
}
以上代码在编译时会产生如下错误:
1>Linking...
1>Callcutor.obj : error LNK2019: unresolved external symbol "public: __thiscall Stack<char>::Stack<char>(int)" (??0?$Stack@D@@QAE@H@Z) referenced in function "public: __thiscall callcutor::callcutor(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0callcutor@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>C:\Users\wangqian\Documents\Visual Studio 2008\Projects\Project1\Calculator\Debug\Calculator.exe : fatal error LNK1120: 1 unresolved externals
1>Build log was saved at "file://c:\Users\wangqian\Documents\Visual Studio 2008\Projects\Project1\Calculator\Calculator\Debug\BuildLog.htm"
1>Calculator - 2 error(s), 0 warning(s)
原因在于,类模版并不是真正的类,它只是告诉编译器一种生成类的方法,编译器在遇到类模版的实例化时,就会按照模版生成相应的类。
在这里就是编译器遇到main函数中的 Stack yuanyuan;时就会去生成一个int类型的Stack类。
而每一个cpp文件是独立编译的,那么如果将类模版的成员函数单独放在一个cpp文件中,编译器便无法确定要根据什么类型来产生相应的类,也就造成了错误。
一般的解决方法就是将类模版中的成员函数定义也写入.h文件中。
以上,欢迎留言交流~
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/13585.html