在模板定义中的空尖括号

时间:2014-05-21 09:21:46

标签: c++ templates

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

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

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

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

3 个答案:

答案 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>();
}