这个问题是在采访中: 此代码是否会导致编译/链接错误,为什么会这样?
template <int T> void f();
template <> void f<0>() {}
void test()
{
f<1>();
}
请解释一下这种行为。非常感谢。
答案 0 :(得分:17)
template<> void f<0>() {}
是参数0
的函数模板的特化,如果调用f<0>()
,将调用此版本的函数。
此代码不正确,导致链接错误,因为f<1>
没有专门化,而且函数的模板版本不是defined
。
答案 1 :(得分:5)
它将编译(所有代码在格式上都是有效的)但在链接阶段会失败。
这是因为template <int T> void f();
已声明,但未定义,&lt; 0&gt;特殊化是已定义,但由于您没有实例化它,因此没有任何可能性。
实际上,&lt; 0&gt;可以 。包含语法错误的专门化和程序 仍然可以编译而不会出错!这是因为正式地,模板只有在使用时才会被编译。 (我不希望候选人在面试条件中表达心态,指出这一点。)
答案 2 :(得分:0)
它将编译,因为编译器可以看到通用模板的声明。还有一个完全专业的0模板。但我们将其称为1,它将尝试调用通用模板,但由于链接器无法找到通用模板的任何定义,程序将显示链接器错误。
Soloution
template <int T> void f();
template <> void f<0>() {}
template <int T> void f() { }
void test()
{
f<1>();
}