【问题标题】:"template<>" vs "template" without brackets - what's the difference?“模板<>”与不带括号的“模板” - 有什么区别?
【发布时间】:2015-04-05 22:40:43
【问题描述】:

假设我已经声明:

template <typename T> void foo(T& t);

现在,有什么区别

template <> void foo<int>(int& t);

template void foo<int>(int& t);

语义上?并且没有括号的模板和带空括号的模板在其他上下文中有其他语义吗?


相关: How do I force a particular instance of a C++ template to instantiate?

【问题讨论】:

    标签: c++ templates template-specialization


    【解决方案1】:

    template &lt;&gt; void foo&lt;int&gt;(int&amp; t); 声明模板的专业化,可能具有不同的主体。

    template void foo&lt;int&gt;(int&amp; t); 导致模板显式实例化,但不引入特化。它只是强制为特定类型实例化模板。

    【讨论】:

    • 这很混乱!我假设声明的意思是,当没有找到专门的定义时,编译器不会接受非专门模板的实例化作为候选?
    • 再解释一下:第一个可以用在头文件中,它说“foo&lt;int&gt;foo&lt;T&gt; 有不同的主体”;如果程序中其他地方的代码调用了foo&lt;int&gt;(),但你没有提供正文,那么你应该得到链接错误。
    • 第二个不应该用在头文件中;在一个 .cpp 文件中使用它可以确保 foo&lt;int&gt; 的主体(它使用 foo&lt;T&gt; 模板来生成它,除非你也有专门化行!)实际上被处理了(这有点像 defining 一个非模板函数)。通常你不需要这样做,因为每当其他代码调用 foo&lt;int&gt; 时就会发生这种情况,但你可能想要这样做 for a few reasons
    • 如果您将 视为空模板参数列表的特例,则不会那么混乱。通常,您使用此语法来创建(可能是部分)特化。如果它碰巧没有任何参数(即不是部分参数),它会为您提供该语法。您仍在声明模板
    • @jdlugosz:我的印象是不支持部分专业化......
    【解决方案2】:

    使用类/结构,

    template <typename T> struct foo {};
    

    以下是专业化:

    template <> struct foo<int>{};
    

    以下是显式实例化:

    template struct foo<int>;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-03
      • 2021-02-14
      • 2010-11-10
      • 1970-01-01
      • 2021-11-18
      • 2011-11-02
      • 1970-01-01
      相关资源
      最近更新 更多