ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-07-29 02:06:32  阅读:136  来源: 互联网

标签:c c11 templates variadic-templates


我尝试使用可变参数创建一个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)生成代码,并且链接器会抱怨未定义的引用.

标签:c,c11,templates,variadic-templates
来源: https://codeday.me/bug/20190729/1567950.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有