C++ 如何解释函数模板解析?

C++ 如何解释函数模板解析?,c++,template-specialization,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;

尝试使用模板和专门化来理解规则,我使用了以下代码

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;
}
template//A
void foo(T);
模板//B
void foo(T*);
模板
void foo(int*);//C
int _tmain(int argc,_TCHAR*argv[]
{
int n=0;
int*p=&n;
富(p),;
返回0;
}
你认为哪个版本的foo会在这里被调用?我以为是C,但事实并非如此。实际上是B,但为什么呢?难道C不是最好的搭配,B不是最好的特化吗

但是,如果我将C更改为

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

模板
void foo(int*)//C
然后foo()调用被解析为C?因此,我没有完全理解
void foo
中尖括号之间的语法和含义

希望有人能澄清这一点


谢谢。

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

当您将C的声明更改为

template <>
void foo<int>(int *) // C
模板
void foo(int*)//C
通过同样的推理,C成为B的特化,而不是a


在这两种情况下,B都赢得重载解析。在第一种情况下,B没有显式的专门化,因此B被调用。在第二种情况下,调用了B的显式专门化C。

抱歉,太密集了。我还是很困惑。我几乎一开始就被甩了。“int*是参数T的值”是什么意思?您能澄清一下吗?当您专门化一个模板函数时,您是在用给定的所有模板参数的值声明该函数。当您键入
template foo(int*)
时,您所说的是
T
int*
。好的,我想在您的原始语句中让我困惑的是,在“如果要专门化A,则T需要与参数的类型相同,它就是。如果你专门化了B,那么参数需要是T*,而不是T。”为了澄清这一点,我只需要通过简单的解释来修改它,比如说:“如果你专门化了A,那么模板参数T需要与函数参数的类型相同,它就是。如果你是专门化B,那么函数参数需要是T*,而不是T。”我说的是函数参数,但不确定这是否是正确的术语。无论正确的术语是什么,都应该与模板参数区分开来。这样一来,就可以清楚地看到,有人第一次试图围绕模板专门化。
template <>
void foo<int>(int *) // C