我想专门化模板类中的特定功能。
例如:
template<class T>
class A
{
public :
void fun1(T val);
void fun2(T val1, T val2);
};
template <class T>
void A<T>::fun1(T val)
{
// some task 1;
}
template <class T>
void A<T>::fun2(T val1, T val2)
{
// some task 2;
}
template <>
void A<char*>::fun2(char* val1, char* val2)
{
// some task 2 specific to char*;
}
当我做这样的事情时,我收到错误消息,说 fun2() 有多个定义
请告诉我为什么这是错误的,以及实现这一点的正确方法。
最佳答案
您的方法 fun2()
本身并不是 template
方法,尽管它是 template
类的成员。我没有找到合适的技术术语,但简单来说,专门化 fun2()
将创建正常函数定义的效果。将定义放在头文件中会给你多个定义错误。
为了解决这个问题, 只需放置一个 inline
关键字 链接器错误就会消失!
template <> inline // <----- 'inline' will prompt to generate only 1 copy
void A<char*>::fun2(char* val1, char* val2)
{
// some task 2 specific to char*;
}
编辑 :这解决了链接器错误。但是你仍然不能使用
A<char*>::fun2
。最终归结为一个事实,即 需要专门化 整个 class A<char*>
或 重载 fun2(char*, char*)
中的 A<T>
template<class T>
class A
{
// constructors
public:
//...
void fun2(char* val1, char* val2)
{
//specific case when T = char*
}
};
关于C++ 模板 : Partial template Function Specialization in template class,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7791579/