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

时间:2013-02-15 01:20:20

标签: c++ templates function-declaration template-function

“在函数声明中使用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) {
}

上述案例中“模板”的含义是什么? 它只是指示该功能是模板功能吗?

2 个答案:

答案 0 :(得分:0)

这只是因为在你的第一个例子中你有模板的定义

template<typename T>
 void func(Window<T>, T) {
}
在由此行表示的强制实例化之后

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

而在第二个例子中,他们是正确的方式。

但是对你的问题的评论是公平的,你提出了一个基本问题('模板意味着什么'),最好通过对该主题的彻底研究来回答。

答案 1 :(得分:0)

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

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