我想专门化模板类中的特定功能。

例如:

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/

10-14 00:44