函数声明中template关键字的含义
The meaning of template keyword in the function declaration
"在函数声明中使用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);
而在第二个例子中,它们是正确的。
但对你的问题的评论是公平的,你问的是一个基本问题("模板是什么意思"),最好通过对主题的深入研究来回答。
相关文章:
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- 表示"accepting anything for this template argument" C++概念的通配符
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- 传递给std::function template的template参数究竟代表什么
- 在template中使用std::variant的template函数
- 谷歌模拟和覆盖关键字
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- 在 c++ 中正确定义"this"关键字?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- C++ template for QList
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- C++ - 为什么这里需要'template'关键字?
- "template"关键字限定符是否会导致代码成功编译,但不同?
- Clang(OS X)要求在特定嵌套声明中"template"关键字,而VS禁止它
- 再次强调typename和template关键字
- 函数声明中template关键字的含义