让我们看一个模板函数,该函数接受void参数并返回void:
template<class T>
void f() {
cout << "template" << endl;
}
稍后我们专门研究这个功能:
template<>
void f<int> () {
cout << "int" << endl;
}
template<>
void f<double> () {
cout << "double" << endl;
}
int main() {
f<int> ();
f<double> ();
}
问题是为什么要编译?我们有三个具有相同签名的功能:
void(void)
,我预计它应该打破多个声明?
答案 0 :(得分:6)
这是因为您明确说明要使用哪个函数。由于模板参数的不同,f<int>()
无法映射到f<double>()
;即这是一个完全明确的呼吁。
答案 1 :(得分:2)
为什么它不起作用?这些是三种不同的实现,具体取决于模板参数。实例化模板时使用的每个不同值都会创建整个模板化事物的全新副本。所以在这里你做了三个功能,它们都是独一无二的,它运行正常。
顺便说一下,符号名称不仅仅是f
,查找C ++名称的修改。