在模板定义中的空尖括号

Net*_*ire 16 c++ templates

这个问题在访谈中: 这段代码是否会导致编译/链接错误,为什么会这样?

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

void test() 
{
    f<1>();
}
Run Code Online (Sandbox Code Playgroud)

请解释一下这种行为.非常感谢.

For*_*veR 20

template<> void f<0>() {}
Run Code Online (Sandbox Code Playgroud)

是参数的函数模板的特化0,如果调用f<0>()此版本的函数将被调用.

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


Bat*_*eba 7

它将编译(所有代码在格式上都有效)但在链接阶段将失败.

这是因为template <int T> void f();声明,但没有定义的,<0>专业化定义但都没有什么给你,因为你没有将其实例化.

事实上,这有可能为<0>专业化含有语法错误和程序仍然无错地编译!这是因为正式地,模板只有在使用时才会被编译.(我不希望候选人在面试条件中表现出来,以指出这一点.)