关于模版函数的全特化

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


  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中实现全特化模版函数,也有一定的道理,它与编译器最后根据用户代码生成的函数是一致的,而这种函数不可能在头文件中,如果在头文件中,势必出现重复定义的错误。



猜你喜欢

转载自blog.csdn.net/fibbery/article/details/8525846