这是一道面试题:
这段代码是否会导致编译/链接错误?为什么会出现这种情况?template <int T> void f();
template <> void f<0>() {}
void test()
{
f<1>();
}
请解释这个行为。非常感谢。template<> void f<0>() {}
如果你调用 f<0>()
,这个函数模板的特化将被调用,它是针对参数0
的。
这段代码是不正确的,它会导致链接错误,因为没有对f<1>
进行特化,同时模板版本的函数也没有被定义
。
template<>
指向函数的完全特化。 - ForEveRtemplate <int T> void f() { }
来涵盖所有情况,对吧?还是只需要 template <> void f<1>() {}
来定义另一个特殊情况?我已经检查过了。 - Chan Kim这段代码在语法上没有问题,可以编译通过,但在链接阶段会失败。
原因是声明了template <int T> void f();
但未定义,而<0>特化已被定义,但对于你来说并没有什么影响,因为你没有实例化它。
实际上,就算<0>特化中存在语法错误,程序仍然可以编译通过!这是因为在模板中,只有当使用时才会被编译。(我不指望面试者在紧张的面试环境下能想到指出这一点。)
}
语法错误,则编译器可能会有问题确定函数定义应该结束的位置,导致它在下一行解析不正确。 - Variadicism它将被编译,因为编译器可以看到通用模板的声明。也有一个完全专门化的模板0。但我们正在调用1的模板,这将尝试调用通用模板,但由于链接器找不到通用模板的任何定义,程序将显示链接器错误。
解决方法
template <int T> void f();
template <> void f<0>() {}
template <int T> void f() { }
void test()
{
f<1>();
}
template <int T> void f() { }
。 - P0W