-2

“在函数声明中使用模板关键字”是什么意思?

在此示例中,编译器错误并出现错误:“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) {
}

在上述情况下,“模板”是什么意思?它只是表明这个函数是模板函数吗?

4

2 回答 2

0

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

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

在此行表示的强制实例化之后:

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

而在第二个示例中,它们是正确的方法。

但是对您的问题的评论是公平的,您问的是一个基本问题(“模板是什么意思”),最好通过对该主题的彻底研究来回答。

于 2013-02-15T02:50:38.917 回答
0

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

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

于 2013-02-15T03:12:13.143 回答