尝试使用模板和特化来理解规则,我使用了以下代码。
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 <>
中尖括号之间的语法和含义。 .
希望有人澄清这一点。
谢谢。
最佳答案
C 不是 B 的特化。C 中尖括号之间的实体 int*
是模板参数 T
的值。如果您专门化 A,则 T
需要与参数的类型相同,事实也是如此。如果您专门研究 B,则参数需要是 T*
,而不是 T
。
当您将 C 的声明更改为
template <>
void foo<int>(int *) // C
同理,C 成为 B 而不是 A 的特化。
在这两种情况下,B 都赢得了重载决议。在第一种情况下,B 没有明确的特化,所以 B 被调用。在第二种情况下,调用 B 的显式特化 C。
关于c++ - 如何解释函数模板解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22138177/