C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 具有可变参数的外部模板无法编译大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我尝试使用可变参数创建一个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段:

如果没有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 – 具有可变参数的外部模板无法编译全部内容,希望文章能够帮你解决c – 具有可变参数的外部模板无法编译所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。