加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 具有可变参数的外部模板无法编译

发布时间:2020-12-16 09:44:14 所属栏目:百科 来源:网络整理
导读:我尝试使用可变参数创建一个extern模板,如: extern templatetypename... XS void log( XS... xs ); 但是gcc 7.2没有编译它,并显示错误: error: expected unqualified-id before ‘’ token 我检查了c 11中的gcc状态,extern模板应该可以工作,不是吗? 解决
我尝试使用可变参数创建一个extern模板,如:

extern template<typename... XS> void log( XS... xs );

但是gcc 7.2没有编译它,并显示错误:

error: expected unqualified-id before ‘<’ token

我检查了c 11中的gcc状态,extern模板应该可以工作,不是吗?

解决方法

extern关键字做的事情与你期望的不同 – 当然,如果我理解你的期望.

extern关键字应用于模板的显式实例化,并且它可以防止编译器在处理某个转换单元时隐式生成该模板的代码.根据C 11标准的第14.7.2 / 2段:

There are two forms of explicit instantiation: an explicit instantiation definition and an explicit instantiation
declaration. An explicit instantiation declaration begins with the extern keyword.

如果没有extern关键字,编译器将在每个包含对log(double,int)调用的转换单元中生成(例如)log(double,int)的代码,并且此代码 – 对于所有翻译单元应该和应该是相同的 – 最终将由链接器合并(链接器基本上会丢弃所有重复项并且只保留一个).

通过告诉编译器,extern关键字可以避免编译时间浪费:“相信我,别人会在其他地方实例化这个模板 – 你现在不需要这样做”.但必须履行这一承诺.

例如,如果您有这个主要模板:

template<typename... Xs> void log(Xs... xs);

并声明这个显式实例化:

extern template void log(int,double);

在某些翻译单元中,您必须具有相应的显式实例化:

template void log(int,double)

否则,编译器永远不会为log< int,double>(int,double)生成代码,并且链接器会抱怨未定义的引用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读