栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++模板编程(8)---更深入的基础技术:参数化声明(Parameterized Declarations)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++模板编程(8)---更深入的基础技术:参数化声明(Parameterized Declarations)

C++ 目前支持两大类template基本类型: class templates和function templates。这个分类还包括member templates。Templates的声明与一般class和functions的声明类似,差别在于templates声明语句有一个参数化子句(parameterization clause):

 template<...parameters here...>

也可能像下面:

export template<...parameters here...>

模板参数的声明先放一放,以下实例展示两种templates,一种是在class之内:也就是member templates,一种是在class之外且在namespace scope之内(全局 scope也可以看做是一种名空间scope):

template

class List {                                   //namespace scope class template

public:

        template     //member function template

        List (List const &);

...

};

template

template

List::List (List const&b)   //class外的 member function template

{

        ...

}

template  

int length (List const&)l  //namespace scope function template

class Collection {

        template    //class 内的member class template

        class Node{

                ...

        };

        template    //class内的member class template, 但是无定义

        class Handle;

        template    // inner class, member function template,inline

        T* alloc() {

        ...

        }

        ...

};

template              //class外的member class template

class Collection::Handle {

...

}

类似地,我们可以有union templates(可看作是class template的一种)

template 

union AllocChunk

{

        T object;

        unsigned char bytes[sizeof(T)];

};

函数模板function template可以有预设的调用自变量(default call argument):

template

void report_top (Stack const&, int number=10);

template

void fill (Array*, T const& = T() );

除了两种template基本类型,另有三种声明也可以被参数化,它们都有类似写法。三者均相当于class template的成员定义:

1) class templates的成员函数定义

2)class templates的nested class members定义

3)class templates的static 成员变量定义

1. 虚拟成员函数Virtual Member Function

Member function template不能声明成virtual。原因是通常虚拟函数调用机制使用一个大小固定不变的表格,其中每一个条目entry记录一个虚拟函数入口entry point。然而直到整个程序编译完成,编译器才能知道有多少个member function template被实例化。

然而一般的class template members可以是虚拟函数,因为当class被实例化时,那些members的数量已经固定:

template

class Dynamic{

public:

        virtual ~Dynamic();  //OK;每个Dynamic都有一个析构函数

        template

        virtual void copy(T2 const&); //Error: 编译器此时并不知道在一个Dynamic中要产生多少

                                                        //个 copy()实例。

};

2. 模板的链接(Linkage)

每个template在其作用域scope内必须有一个独一无二的名称,除非是重载的overloaded function template。特别注意的是,class template 不能和其他种类的名称共享同一个名称,这点与一般non-template的class不同。比如:

int C;

class C;  //ok

int X;

template

class X;  //Error;

struct S;

template

class S;   //Error;

Template名称需要链接,但不能够使用C链接方式,默认是C++链接方式:

extern “C++” template

void normal();   //上面是正常链接方式,extern “C++”也可省略不写。

extern "C" template

void invalid();   //上面是无效的,不能使用C链接方式。

Template通常使用外部链接(external linkage)。唯一例外的是static namespace scope function templates:

template 

static void internal(); //与另一文件中的同名template无关。

3. 主模板、原始模板Primary Templates

正规标准的template声明语句声明的是primary templates。这一类语句在template名称后面并不添加由角括号括起来的template argument list:

template class Box;     //OK: primary template

template class Box; //Error

template void translator(T*);  //OK

template void translate(T*); //Error

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/989678.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号