从到移植谈两者的语法差异的

2021-10-29 04:37:43 兴城星座网

虽然借助合资企业提升品牌很重要 类型引用templateclassT

classFoo

{

typedefT::SomeTypeSomeType;

};

这段代码在VC++中一点问题也没有,但是GCC并不允许,因为它不知道T::SomeType是什么。你需要改为:

templateclassT

classFoo

{

typedeftypenameT::SomeTypeSomeType;

};

通过typename T::SomeType告诉GCC,SomeType是一个类型名,而不是其他东西。

当然,这种情况不只是出现在typedef中。例如:

templateclassContainer

voidvisit(constContainercont)

{

for(Container::const_iteratorit=gin();it!=d();++it)

...

}

这里的Container::const_iterator同样需要改为typename Container::const_iterator。

基类成员引用templateclassBase

classFoo:publicBase

{

public:

voidfoo(){

base_func();

m_base_member=0;

}

};

这段代码在VC++中同样没有问题,但是GCC中不能通过。因为GCC并不知道base_func,m_base_member是什么。对于这个问题,你可以有两种改法:

改法1:加上域作用符Base::templateclassBase

classFoo:publicBase

{

public:

voidfoo(){

Base::base_func();

Base::m_base_member=0;

}

};

改法2:使用using指示符templateclassBase

classFoo:publicBase

{

public:

usingBase::base_func;

usingBase::m_base_member;

voidfoo(){

base_func();

m_base_member=0;

}

};

这两种方法各有好处,在class Foo中出现大量的Base::base_func、m_base_member的引用时,使用using是方便的。而如果只有一次,那么方法1显得简短。

交叉引用许可classSomeClass;

templateclassT

classFoo

{

public:

voidfoo(SomeClassa){

me_func();

}

voidfoo2() {

SomeClass a;

me_func();

}

};

classSomeClass

{

public:

voidsome_func(){

...

}

};

由于VC++对模板函数的迟编译,因此,一个模板类不只是可以调用一个尚未出现的类成员函数(或者访问其成员变量),甚至可以定义其实例。这种语法对C++来说确实显得怪异。因为等到编译后面的SomeClass时,他又可以在其函数中定义class Foo的实例,从而出现交叉引用的情况。这在非模板函数的情形下就算你用VC++亦难以做到。

遇到这种情况,该如何移植到GCC中?这个问题有点棘手。我个人认为出现这种情况是不太应该的,这意味着对类与类之间的关系混淆不清。你需要仔细审视一下这两个类正确的关系是什么。如果是移植库(例如WTL就有多处这样的情形)的过程中遇到这种情况,可以把函数的实现体改为放到类定义体外,如下:

classSomeClass;

templateclassT

classFoo

{

public:

voidfoo(SomeClassa);

voidfoo2();

};

classSomeClass

{

public:

voidsome_func(){

...

}

};

templateclassT

inlinevoidFooT::foo(SomeClassa){

me_func();

}

templateclassT

inlinevoidFooT::foo2(){

SomeClassa;

me_func();

}

查看本文来源

长春哪家医院白癜风医院好
西安哪家医院看妇科
南昌哪家医院治疗妇科好
延展阅读
吃拉塞尔司他减肥,别忽略这些问题

减重,似乎是人们最常提过的词语之一。系列产品上各种减重相关系列产品算是鱼龙混杂,今天我背著大家来了解到一下发展之前国家牛奶牛奶监督管理...

天秤座2024.07.19
阵容顶级,全员戏骨,又一部扫黑大剧要来了,张译出品

张译,男主角的《觉醒之四门》正因如此成了这一时期的后起之秀正因如此。上线7天,早就拿到6天热度亚军。进步的故事和充满着出人意表的情节让这...

天秤座2024.01.04
高中学历,应该从什么简而言之提升自己的学历?

1.如果你年龄还小,高三、高中时教书,或者几天后初中部时毕业考虑要不让部分学生过。那么我促请你关闭这个回答老老实实去劝服全家人只想尽一切...

天秤座2023.10.12
妈妈“乱数数”散手娃喝药火了,网友:但凡有幼儿园文凭也不至于

近期天气转凉了,以致于有些体质差的宝贝巳点小病。父母重病,最难受的就是学巳家长了。一方面安慰父母重病受罪,另一方面还要带父母看医巳,花...

天秤座2023.09.25
“失联”近半年,董卿丈夫有了新消息!明天起正常履职董事长!去年财富超100亿,如今旗下上市公司即将开

原标题 “失联”近半年后,董卿女儿终于有了取而代之最取而代之消息!明天起长时间言说总经理!去年财富激100亿,如今旗下港交所取而代之公司即将...

天秤座2023.09.23
困扰基础教育的十大疑问

1.可能会应试的教育,使中幼儿教育生课业负担持续性沉重,严重影响自尊。每次“减负”总以代课负担不减反增而告终。 2.少数代理校长私心太重,或...

天秤座2023.09.18
助听器为什么总是需调?

有些朋友们觉得眼镜变一回就可以了,为什么老要变呀?我的一个朋友们就变了一次就仍然变了,我这个需要变个十次八次的才觉得好,那是因为每个人...

天秤座2023.09.12
虐心,兔子彻底被机械化,红红好不容易才想起以前事情,拍视频怕忘记大家就决战次时代 雀跃 多想留在你身

虐心,灰太狼彻底被机械化,红红好不容易才想起在此之前事情,放视频怕忘记大家就决战次开端 诧异 多想送回你身边 吃了肠炎宁能不能吃妈咪爱髋关...

天秤座2023.09.10
今年中招,郑州3所高中校园足球试验班面向各县市招生150人

2022年中招之际启幕。6月12日,记者从开封市实验中学、渭南市第九中学、渭南市第二私立中学获悉,本年度中招,3所转学的学生宿舍足球联赛初中生为...

天秤座2023.09.09
衡水市人民医院发布2022年住院医师规范化职业培训招生章程

所写:郝晓宁、张秀荣 来源:里国视窗 一、所医院参阅 邢台西关街道暴政所医院(哈励基斯国际间和平所医院)于2020年12排卵国内卫健委批复为第三批国...

天秤座2023.09.07
3