函数声明中template关键字的含义

The meaning of template keyword in the function declaration

本文关键字:关键字 template 声明 函数      更新时间:2023-10-16

"在函数声明中使用template关键字"是什么意思?

在本例中,编译器出现错误,错误为:"func"不是模板函数。

template<typename T>
struct Window {
  T value;
};
template void func(Window<int>, int);
template<typename T>
void func(Window<T>, T) {
}
int main(void) {
}

但下面的例子是可以的

template<typename T>
struct Window {
  T value;
};
template<typename T>
void func(Window<T>, T) {
}
template void func(Window<int>, int);
int main(void) {
}

在上述情况下,"模板"的含义是什么?它只是指示这个函数是模板函数吗?

以关键字template开头且之后没有<尖括号>的声明称为显式实例化。它意味着查找模板定义并插入指定的模板参数,以获得特定的函数专用化或类专用化。因此,在第一个示例中,编译器抱怨它无法实例化func(Window<int>, int),因为它还不了解名为func的模板。

显式实例化通常是不必要的,因为模板可以通过尝试使用它们来隐式实例化。但是显式实例化可以控制相关链接器符号的出现位置和方式,并且在某些情况下可以用于将模板定义从头文件移到源文件中。

这只是因为在您的第一个示例中,您已经定义了模板

template<typename T>
 void func(Window<T>, T) {
}

在由以下行表示的强制实例化之后:

template void func(Window<int>, int);

而在第二个例子中,它们是正确的。

但对你的问题的评论是公平的,你问的是一个基本问题("模板是什么意思"),最好通过对主题的深入研究来回答。