在类中有一个模版函数,只有一个参数类型,对其进行特化时遇到了一点小麻烦,为了能够帮助更多人解决问题以及作为自己的学习笔记,把解决的整个过程记录下来。
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中实现全特化模版函数,也有一定的道理,它与编译器最后根据用户代码生成的函数是一致的,而这种函数不可能在头文件中,如果在头文件中,势必出现重复定义的错误。