没有参数的函数的模板特化
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<DefinedClass>
中没有未定义的模板参数,是否可以在.cpp 中声明主体?
注意:doStuff 将在其主体中使用 T 来声明变量。
【问题讨论】:
当你说“它没有编译”时,你应该包括相关的错误信息。template<typename T> void doStuff<T>()
是否首先编译(我认为这 <T>
无效)。
【参考方案1】:
主模板没有获得第二对模板参数。就是这样:
template <typename T> void doStuff()
// ^^^^^^^^^
只有专业化在前面有一个template <>
,在名字后面有一个<...>
,例如:
template <> void doStuff<int>()
【讨论】:
谢谢,但还是不行。如果我这样写专业化:“template voidtemplate<> void doStuff<int>();
,一般情况下应该是template<typename T> 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++模板进阶(非类型模板参数类模板的特化和模板的分离编译)