相关疑难解决方法(0)

GCC和MS编译器的模板实例化细节

任何人都可以提供比较或具体细节,说明在GCC和MS编译器中如何在编译和/或链接时处理模板实例化?这个过程在静态库,共享库和可执行文件的上下文中是不同的吗?我找到了关于GCC如何处理它的文档,但我不确定这些信息是否仍然指的是当前的状态.在编译我的库时,我应该使用他们建议的标志,例如-fno-implicit-templates吗?

我所知道的(可能不一定正确)是:

  • 模板将在实际使用时实例化
  • 模板将作为显式实例化的结果进行实例化
  • 重复实例化通常通过折叠重复实例化或通过延迟实例化直到链接时间来处理

c++ compiler-construction gcc templates visual-studio

44
推荐指数
1
解决办法
9184
查看次数

递归显式模板实例化可能吗?

给出一个类似的模板

template<int dim> class Point { ... };
Run Code Online (Sandbox Code Playgroud)

这个模板可以明确地实例化

template class Point<0>;
template class Point<1>;
template class Point<2>;
template class Point<3>;
Run Code Online (Sandbox Code Playgroud)

而不是像上面那样单独实例化每个模板,我想用一个调用来递归地实例化它们

template class RecursiveInstantiate<Point, 3>;
Run Code Online (Sandbox Code Playgroud)

其中,RecursiveInstantiate<T, i>将实例T<i>,T<i-1>..., T<0>.是否有可能创建这样一个类RecursiveInstantiate?如果不可能,您是否知道使用预处理器的方法?

其实我感兴趣的概括这对于喜欢多个模板参数类Node<int i1,int i2,int i3>为I1,I2,I3的所有组合{0,1,2,3}.但我希望能够自己解决这第二部分.

任何建议,也解释为什么我想要达到的目标是不可能的.


更新:感谢您对目前的评论.我现在更清楚地看到问题的确切位置.这条线

template class Point<3>;
Run Code Online (Sandbox Code Playgroud)

实例化模板并将其符号导出到目标文件.表单的实例化

template class RecursiveInstantiate<Point, 3>;
Run Code Online (Sandbox Code Playgroud)

可以实例化类class Point<3>,class Point<2>....显然这只发生在本地.模板不会导出到目标文件.也许我将不得不使用预处理器寻找解决方案.

正如我现在所看到的那样,我在开始时并未完全提出我的问题,我感谢您的答案和选择的答案是正确的.

注意:我在linux上使用g ++/clang作为编译器进行尝试.

c++ templates

6
推荐指数
1
解决办法
1171
查看次数