如何解释功能模板解析?

时间:2014-03-03 03:30:19

标签: c++ template-specialization

使用模板和专业化试图理解我使用以下代码的规则。

template <typename T> // A
void foo(T);

template <typename T> // B
void foo(T *);

template <>
void foo<int *>(int *); // C

int _tmain(int argc, _TCHAR* argv[])
{
    int n=0;
    int *p = &n;
    foo(p);

    return 0;
}

您认为哪个版本的foo会在这里调用?我当时正在等待C.但事实并非如此。它实际上是B.但为什么呢? C不是B的最佳匹配和专业化吗?

但是,如果我将C改为

template <>
void foo<>(int *) // C

template <>
void foo<int>(int *) // C

然后foo()调用被解析为C?所以我不完全理解void foo <>中有角度括号之间的语法和含义。

非常感谢有人澄清这一点。

感谢。

1 个答案:

答案 0 :(得分:1)

C不是B的特化.C,int*中的尖括号之间的实体是模板参数T的值。如果你是专门的A,那么T需要与参数的类型相同。如果您要专门化B,则参数必须为T*,而不是T

当您将C的声明更改为

template <>
void foo<int>(int *) // C

C通过相同的推理成为B的专业化但不是A的专业化。

在这两种情况下,B都会赢得重载决议。在第一种情况下,B没有明确的特化,所以B被调用。在第二种情况下,C,B的显式特化被调用。