类模板的使用~

类模板的使用~上一篇文章中是关于实习一个多功能计算器,计算表达式需要用到两个栈,一个存储表达式中的数字,一个存储表达式中的符号,刚刚好前面我也发过有关手动实现栈的文章,于是就想给大家看看手动栈在实际项目中的运用,可不曾想,使用类模板时错误连连,查了很多资料,这里总结一下~类模板的定义可用类模板来定义类,类模板是对象特性更为一般的抽象。简而言之,一个类模板就是一个抽象的类、类模板的一般定义形式为:…

大家好,欢迎来到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

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信