关于模版函数的全特化

本文记录了作者在尝试全特化一个只有一个参数的模板函数时遇到的问题及解决方案。作者发现将全特化函数的实现放在.cpp文件中可以避免重复定义错误,因为全特化模板函数如同派生的普通函数,依赖模板匹配。这一做法使得全特化函数与编译器生成的函数保持一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在类中有一个模版函数,只有一个参数类型,对其进行特化时遇到了一点小麻烦,为了能够帮助更多人解决问题以及作为自己的学习笔记,把解决的整个过程记录下来。


  object.h

class CObject
{
public:
   template <class T>
   int func()
   {
      return sizeof(T);
   }

   //假设对于int类型func函数要返回常数100
   template <>
   int func<int>()
   {
      return 100;
   }
};
上述代码中g++中编译会有错误,提示特化函数定义的域有问题,不知道g++如何考虑,为什么不允许这样做!

在网上搜索了一下,有些人这样解决:

class CObject
{
public:
   template <class T>
   int func()
   {
      return sizeof(T);
   }
};

//假设对于int类型func函数要返回常数100
template <>
int func<int>()
{
   return 100;
}

确实编译通过了,但,如果该头文件在多个cpp文件中引用后,会发生链接时错误,该函数重复定义。

经过一翻考虑,试着将特化的函数放在了object.cpp文件中,在头文件中只保留原始的模版函数声明和其实现:

object.h

class CObject
{
public:
   template <class T>
   int func()
   {
      return sizeof(T);
   }
};
object.cpp

//假设对于int类型func函数要返回常数100
template <>
int func<int>()
{
   return 100;
}
再编译和链接,问题就完全解决了。


总结,我理解,对于模版函数的全特化,既有普通函数的特点,又有模版的特性,是一个模版派生出来的普通函数,又要依据模版匹配而匹配全特化模版函数。所以,放在cpp中实现全特化模版函数,也有一定的道理,它与编译器最后根据用户代码生成的函数是一致的,而这种函数不可能在头文件中,如果在头文件中,势必出现重复定义的错误。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值