没有参数的函数的模板特化

Posted

技术标签:

【中文标题】没有参数的函数的模板特化【英文标题】: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; 无效)。 【参考方案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>()


【讨论】:

以上是关于没有参数的函数的模板特化的主要内容,如果未能解决你的问题,请参考以下文章

C++模板详解:泛型编程模板原理非类型模板参数模板特化分离编译

C++模板进阶(非类型模板参数类模板的特化和模板的分离编译)

函数模板参数包后跟模板参数和特化

C++模板进阶操作 —— 非类型模板参数模板的特化以及模板的分离编译

C++模板

C++ 模板(进阶)