加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C模板:模板类中的部分模板函数专业化

发布时间:2020-12-16 09:37:51 所属栏目:百科 来源:网络整理
导读:我想专门化模板类中的特定功能. 例如: templateclass Tclass A { public : void fun1(T val); void fun2(T val1,T val2);};template class Tvoid AT::fun1(T val){ // some task 1;}template class Tvoid AT::fun2(T val1,T val2){ // some task 2;}templat
我想专门化模板类中的特定功能.

例如:

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()本身不是模板方法,尽管它是模板类的成员.我没有找到合适的技术术语,但简单来说,专门的fun2()将创建正常函数定义的效果.将定义放在头文件中会给您带来多个定义错误.

要解决这个问题,只需输入一个内联关键字,链接器错误就会消失!

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.归根结底,它归结为你需要专门化整个A< char *>类的事实.或者在A< T>内重载fun2(char *,char *).

template<class T>
class A
{
  // constructors
public:
  //...
  void fun2(char* val1,char* val2)
  {
    //specific case when T = char*
  }
};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读