C++模板类和类模板

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++模板类和类模板相关的知识,希望对你有一定的参考价值。

我在书上看到在定义了模板类了以后就可以定义类模板,它就列出了三页书的例子给我看,并没有详细的给我解释,弄得我很+_+,所以想请大家帮忙通俗的解释一下模板类和类模板,加分如下:
解释得我能听得懂加10分。
有具体简单合法的C++程序作证明的(不超过25行为佳),加15分。
悬赏5分。
呵呵,_鈊_烦_薏乱你能不能让我不那么o(╯□╰)o呢?

用相同的类模板可以组建任何类型的对象集合。在传统C++中,可能有一个浮点数类或者一个整数类,如果使用类模板,可以定义一个对两者都适用的类number。

类模板说明

类模板说明的一般形式是:

template <类型形参表>

class <类名>

//类说明体



template <类型形参表>

<返回类型> <类名> <类型名表>::<成员函数1>(形参表)

//成员函数定义体

template <类型形参表>

<返回类型> <类名> <类型名表>::<成员函数2>(形参表)

//成员函数定义体



12.3.2 使用类模板

与函数模板一样,类模板不能直接使用,必须先实例化为相应的模板类,定义该模板类的对象后才能使用。

建立类模板后,可用下列方式创建类模板的实例:

<类名> <类型实参表> <对象表>;

其中,<类型实参表>应与该类模板中的<类型形参表>匹配。<类型实参表>是模板类(template class),<对象>是定义该模板类的一个对象。

使用类模板可以说明和定义任何类型的类。这种类被称为参数化的类。如果说类是对象的推广,那么类模板可以说是类的推广。

注意:类模板与模板类的区别 。

一个简单的类模板程序(求两个任意类型数的和)。
template<class T>
class A


public:
A();
A(T _a,T _b);
T sum();
private:
T a;
T b;
;

template <class T>
A<T>::A()

a=0;b=0;


template<class T>
A<T>::A(T _a,T _b)

a=_a;b=_b;

template<class T>
T A<T>::sum()

return (a+b);

void main()

A<int> ai(3,4);
A<double> ad(3.1,4.0);
cout<<ai.sum()<<" "<<ad.sum()<<endl;


程序已经在vc6.0下调试通过,以上代码在一个文件中,别把类的声明放在一个.h中把实现放在.cpp中,类模板不支持分离只能是类的声明和定义放在同一个文件中。

参考资料:http://hi.baidu.com/%C3%CE%C0%EF%CF%E3%B0%CD%C0%AD/blog/item/b7ad970ecebe5be636d12282.html

参考技术A 模板类,类模板,TMD,中国的书最喜欢钻字眼,说到底不就是template class么?SHIT。

在我看来,没区别,8好意思,我我我又骂人了。

------------
或许强调的重点不同吧,前者强调这TMD是个类,后者强调这个是个模板。其实就是一个东西,猪和Pig本来就是一个东西。
------------
OMG,我好乱。
---------

00------------------0000
回看:楼主,你很囧啊?其实我也很囧。哈哈。

C++:派生模板类和基类之间的向下转换和向上转换?

【中文标题】C++:派生模板类和基类之间的向下转换和向上转换?【英文标题】:C++: downcasting and upcasting between derived template class and base class? 【发布时间】:2016-11-05 14:10:25 【问题描述】:

我在将指向模板派生类的指针转换为基类指针以便存储在映射中时遇到了问题(显然稍后会检索它。)。我有:

#include <map>
//Role.h
class RoleBase;
enum class RoleEnum : int;

template<RoleEnum role>
class Role : public RoleBase;

//Relationship.h
class Relationship
public:
    template<RoleEnum role>
    Role<role>* getRole()
    auto it=RoleMap.find(role);
    if ( it == RoleMap.end() ) 
       return nullptr;
     else 
            RoleBase* roleBase= it->second;
            return static_cast<Role<role>* >(roleBase);
        
    
    std::map<RoleEnum,RoleBase*> RoleMap;
;

//squash.h
enum class RoleEnum : int

    Player,
    Referee
;

template<> class Role<RoleEnum::Player>;
template<> class Role<RoleEnum::Referee>;

class SquashGame: public Relationship
public:
    SquashGame()
        RoleBase* playerRole=new Role<RoleEnum::Player>; //problematic
        RoleMap.emplace(RoleEnum::Player,playerRole);
    
;

int main() 
    SquashGame squashGame;
    squashGame.getRole<RoleEnum::Player>();
    return 0;

为什么会这样?有没有办法解决这个问题,这样我就可以使用枚举值对一个类进行模板化,以便通过 getClass&lt;Enum&gt; 函数从外部调用,正如示例中所希望的那样?

【问题讨论】:

【参考方案1】:

问题很简单:你对角色的重新定义

template<> class Role<RoleEnum::Player> 

不扩展RoleBase

要么删除它,要么将其更改为:

template<> class Role<RoleEnum::Player> : public RoleBase 

【讨论】:

哈!为什么编译器没有警告我我不正确的模板专业化!猜猜编译器是如何解释这些角色的? 模板在你使用时被实例化,当模板被实例化时它是memoized。 如果你特化一个模板,编译器会使用你的定义而不是自己创建一个新的定义。

以上是关于C++模板类和类模板的主要内容,如果未能解决你的问题,请参考以下文章

7群体类和群体数据的组织-1.函数模板和类模板

C++模板第一篇:函数模板和类模板

c++函数模板和类模板

c++函数模板和类模板

c++函数模板和类模板

C++ 提高教程 模板-函数模板和类模板