我尝试使用可变参数创建外部模板,如下所示:
extern template<typename... XS> void log( XS... xs );但是gcc 7.2没有编译,并显示了错误:
error: expected unqualified-id before ‘<’ token我在c++11里查了一下gcc的状态,外挂模板应该可以,对不对?
发布于 2013-04-18 16:08:21
当然,如果我正确理解了您所期望的内容,那么extern关键字所做的事情与您所期望的有所不同。
extern关键字应用于模板的显式实例化,它防止编译器在处理某个转换单元时隐式地生成该模板的代码。根据C++11标准的第14.7.2/2段:
有两种形式的显式实例化:显式实例化定义和显式实例化声明。显式实例化声明以关键字
extern开头。
如果没有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)生成代码,并且链接器会抱怨未定义的引用。
https://stackoverflow.com/questions/16077430
复制相似问题