模板定义中的空尖括号

Empty angle brackets in template definition

本文关键字:定义      更新时间:2023-10-16

面试时的问题:这段代码会导致编译/链接错误吗?为什么会这样?

template <int T> void f();
template <> void f<0>() {}
void test() 
{
    f<1>();
}

请解释这种行为。非常感谢。

template<> void f<0>() {}

是参数0的函数模板专门化,如果你调用f<0>(),这个版本的函数将被调用。

这个代码是不正确的,它会导致链接错误,因为f<1>没有专门化,函数的模板版本不是defined

它将编译(所有代码在语法上是有效的),但将在链接阶段失败。

这是因为template <int T> void f();是声明的,但没有定义,<0>专门化是定义的,但这对你没有任何影响,因为你没有实例化它。

实际上,如果<0>专门化包含语法错误,程序仍然可以编译而没有错误!这是因为模板只有在使用时才会被编译。(我不指望应聘者在面试时能沉着地指出这一点。)

它会编译,因为编译器可以看到泛型模板的声明。0也有一个完全专用的模板。但是我们为1调用它,它将尝试调用泛型模板,但由于链接器无法找到通用模板的任何定义,因此程序将显示链接器错误。

Soloution

template <int T> void f();
template <> void f<0>() {}
template <int T> void f() { }

void test() 
{
  f<1>();
}