使用模板和专业化试图理解我使用以下代码的规则。
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 <>
中有角度括号之间的语法和含义。
非常感谢有人澄清这一点。
感谢。
答案 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的显式特化被调用。