【问题标题】:C++ template full specialization syntax [duplicate]C ++模板完整专业化语法[重复]
【发布时间】:2015-09-11 15:46:00
【问题描述】:

在声明模板特化时,带 (1) 和不带尖括号 (2) 的语法有什么区别。

如果未提供方法的实现(定义)(如本例中),为什么版本 1 会失败,并出现错误:undefined reference to int f<int>(int) 而版本 2 按预期工作?

template <typename T> T f(T val) {
    return val;
}
template<> int f<int>(int val); // 1
template int f<int>(int val);   // 2
int main() {
    cout << f(555);
}

我见过this answer,但它没有明确描述这些不同语法之间的区别。

【问题讨论】:

  • #1 是专业化,#2 是显式实例化。
  • 您链接的answer 将这些形式解释为专业化和实例化。此外,它还链接到另一个 answer,解释了它们的区别。
  • 你是对的。 “与上面相同”的评论让我感到困惑。

标签: c++ templates syntax template-specialization


【解决方案1】:

您只是混淆了显式实例化模板专业化

No1 是模板特殊化,意味着你想为给定类型的模板定义一个特殊的版本,所以你必须为它提供一个可能不同的定义。

No2 是显式实例化,表示您希望编译器显式地实例化具有给定类型的模板。它将基于主模板生成。

Explicit instantiation:

显式实例化定义强制实例化 他们所指的函数或成员函数。它可能出现在 在模板定义之后的任何地方编程,并且对于给定的 参数列表,只允许在程序中出现一次。

显式实例化声明(外部模板)可防止 隐式实例化:否则会导致 隐式实例化必须使用显式实例化 在程序的其他地方提供的定义。

explicit (full) template specialization:

允许为给定的一组模板参数自定义模板代码。

【讨论】:

    【解决方案2】:

    在第一种情况下,您告诉编译器专门化模板函数(说“int 类型的模板不同”),但您没有提供专门化函数定义,因此是“未定义的参考”。这个错误几乎总是意味着:“你声明了一个函数,在别处使用它,但没有定义它”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 2023-01-13
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多