正确使用函数的显式模板实例化?

Posted

技术标签:

【中文标题】正确使用函数的显式模板实例化?【英文标题】:Correct use of explicit template instantiation for functions? 【发布时间】:2020-11-21 15:56:46 【问题描述】:

我目前正在进行一项练习,我应该在我的所有函数中使用模板矩阵作为参数,并在标题中强制使用所需的数据类型。我真的不知道该怎么做。 有一个带有以下函数的标题和一个具有相同语法的第二个函数(如果相关,还有相同的模板名称?):

template <typename multityp> void matsum( multityp **, multityp **, multityp **, int, int );

template void matsum <int> (int**, int**, int**, int, int);
template void matsum <double> (double**, double**, double**, int, int);
template void matsum <bool> (bool**, bool**, bool**, int, int);

编译时,我在以下函数中收到错误“变量或字段'matsum'声明无效”,用于“multityp”,我将其放置在另一个标头中,然后出现多个“变量未声明”错误:

void matsum ( multityp **matrix1, multityp **matrix2, multityp **ergebnis, int zeilen, int spalten )
      //Does stuff

【问题讨论】:

你能提供一个完整的可重现的例子吗?仅从那些代码sn-ps很难找到问题。 看这个答案,可能是multityp 没有声明:***.com/questions/364209/…。鉴于上面如何使用multityp,您是否在void matsum 之前缺少template &lt;typename multityp&gt; @DanielLangr 这实际上是该函数的所有代码,所有其他代码都与在结构上与该函数完全相同的其他函数相关。唯一要添加的是带有#ifndef [...] 的标头的守护者,因此将其键入.hpp 并编译应该会给出提供的错误。 @parktomatomi 好吧,现在我觉得有点愚蠢......我并没有真正想到 template &lt;typename multityp&gt; 作为函数头的一部分,所以我把它留给定义身体。现在可以了! 【参考方案1】:

根据parktomatomi的评论添加

template <typename multityp>

在 body 声明前面做了诀窍:

template <typename multityp> void matsum ( multityp **matrix1, multityp **matrix2, multityp **ergebnis, int zeilen, int spalten )
      //Does stuff

【讨论】:

以上是关于正确使用函数的显式模板实例化?的主要内容,如果未能解决你的问题,请参考以下文章

用于实例化模板代码的显式习惯用法 - 不包括其源代码

仅标头模板的显式实例化声明(外部模板)

使用模板化成员函数显式实例化模板类

MSVC:显式模板实例化失败,而隐式实例化成功

如何对复杂的模板化函数进行显式实例化?和相关的 Intellisense 错误

将 pimpl 与 Templated Class 和显式实例化的模板一起使用