c++ - 如何解释函数模板解析?

标签 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 <> 中尖括号之间的语法和含义。 .

希望有人澄清这一点。

谢谢。

最佳答案

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/

相关文章:

c++ - 查找最大对数的有效算法

c++ - 将 QComboBox 与 QSqlQueryModel 一起使用

c++ - 特化一个成员函数而不是整个类

c++ - 模板化类中模板化成员函数的特化

c++ - 为什么常量的模板特化需要 const 变量

C++11 多重移动构造函数调用

C++:作为指针的全局变量

c++ - 如何从 'const tm*' 生成 'const tm&' ?

c++ - VS2017模板特化报错cannot convert from 'Class *(__cdecl *)(Args...)' to 'Class *(__cdecl *)(Args...)'

C++类模板特化问题