【问题标题】:Template Specialization for a function without Parameters没有参数的函数的模板特化
【发布时间】:2013-02-08 09:49:43
【问题描述】:

我需要在 c++ 中专门化一个函数模板。

template<typename T>  
void doStuff<T>() {}

template<>
void doStuff<DefinedClass>();

template<>
void doStuff<DefinedClass2>();

我猜这不是正确的语法(因为它没有编译)。我该怎么做?
另外,由于我在doStuff&lt;DefinedClass&gt; 中没有未定义的模板参数,是否可以在.cpp 中声明主体?

注意:doStuff 将在其主体中使用 T 来声明变量。

【问题讨论】:

  • 当你说“它没有编译”时,你应该包括相关的错误信息。
  • template&lt;typename T&gt; void doStuff&lt;T&gt;() {} 是否首先编译(我认为这 &lt;T&gt; 无效)。

标签: c++ templates specialization


【解决方案1】:

主模板没有获得第二对模板参数。就是这样:

template <typename T> void doStuff() {}
//                        ^^^^^^^^^

只有专业化在前面有一个template &lt;&gt;,在名字后面有一个&lt;...&gt;,例如:

template <> void doStuff<int>() { }

【讨论】:

  • 谢谢,但还是不行。如果我这样写专业化:“template void doStuff();”我得到:“'>' 标记之前的无效显式特化”
  • 如果我放"模板" 我在主模板声明中得到"template-id `buildBom'"
  • 不,专业化应该是template&lt;&gt; void doStuff&lt;int&gt;();,一般情况下应该是template&lt;typename T&gt; void doStuff();...
  • @Synxis:谢谢!我添加了该示例,并从第一组中删除了...,因为无论如何您都不能部分专门化函数。有时一个不太笼统的答案更有帮助:-)
【解决方案2】:

主模板的正确语法是:

template <typename T>
void doStuff() {}

要定义专业,请执行以下操作:

template <>
void doStuff<DefinedClass>() { /* function body here */ }

【讨论】:

    【解决方案3】:

    我猜这不是正确的语法(因为它没有编译)。我该怎么做? doStuff 将在其主体中使用 T 来声明一个变量。

    template<typename T>  
    void doStuff() 
    {
      T t = T();   // declare a T type variable
    
    }
    

    是否可以在 .cpp 中声明正文?

    C++只支持inclusive mode,不能单独编译后再链接。

    来自评论,如果您想专攻int,请输入:

    template<>
    void doStuff<int>()
    {
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多