函数模板具体化出错报错说找不多匹配的声明

嘿碳头 2017-08-16 10:35:46
#include<iostream>
#include<iomanip>
#include<cstring>
using namespace std;
class CName
{
char *name;
public:
CName(char* str=NULL)
{
if(str) { name=new char [strlen(str)+1]; strcpy(name,str);}
}
~CName()
{
if(name){ delete [] name; name=NULL;}
}
void SetName(char* str)
{
if(name){delete [] name; name=NULL;}
if(str){name=new char [strlen(str)+1]; strcpy(name,str);}
}
char* GetName(void)
{
return name;
}
void print()
{
cout<<name<<endl;
}
};

template <class T, int ID>
void myswap(T &a, T &b)
{
T temp;
temp=a; a=b; b=temp;
cout<<"调用引用参数的函数模板!ID="<<ID<<endl;
}
template<>
void myswap<CName,int>(CName &a, CName &b)//编译报错 找不到匹配的函数模板声明
{
char *temp=new char[strlen(a.GetName())+1];
strcpy(temp,a.GetName());
a.SetName(b.GetName());
b.SetName(temp);
delete [] temp;
cout<<"调用CName引用参数的模板函数"<<endl;
}
template <class T,int ID>
void myswap(T *a, T *b)
{
T temp;
temp=*a; *a=*b; *b=temp;
cout<<"调用指针参数的函数模板!ID="<<ID<<endl;
}

template<>
void myswap<CName,int>(CName *a, CName *b)//编译报错 找不到匹配的函数模板声明
{
char *temp=new char [strlen(a->GetName())+1];
strcpy(temp,a->GetName());
a->SetName(b->GetName());
b->SetName(temp);
cout<<"调用CName的指针参数的模板函数!"<<endl;
}

int main()
{

int a=8,b=10;
myswap<int,3>(a,b);
myswap<int,3>(&a,&b);
CName one((char*)"Ding");
CName two((char*)"ZHANG");
// one.print();
// two.print();
myswap<CName,1>(one,two);
myswap<CName,1>(&one,&two);
myswap<CName,2>(one,two);
myswap<CName,2>(&one,&two);
// one.print();
// two.print();
return 0;
}
...全文
194 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
嘿碳头 2017-08-17
  • 打赏
  • 举报
回复
int ID 不是模板,是个类型,特化的是T
xskxzr 2017-08-17
  • 打赏
  • 举报
回复
int ID你用int特化???
sdghchj 2017-08-16
  • 打赏
  • 举报
回复
特化也没用到ID,所以直接用普通函数也行。 template <class T, int ID> void myswap(T &a, T &b) { T temp; temp=a; a=b; b=temp; cout<<"调用引用参数的函数模板!ID="<<ID<<endl; } void myswap(CName &a, CName &b) { char *temp=new char[strlen(a.GetName())+1]; strcpy(temp,a.GetName()); a.SetName(b.GetName()); b.SetName(temp); delete [] temp; cout<<"调用CName引用参数的模板函数"<<endl; } template <class T,int ID> void myswap(T *a, T *b) { T temp; temp=*a; *a=*b; *b=temp; cout<<"调用指针参数的函数模板!ID="<<ID<<endl; } void myswap(CName *a, CName *b) { char *temp=new char [strlen(a->GetName())+1]; strcpy(temp,a->GetName()); a->SetName(b->GetName()); b->SetName(temp); cout<<"调用CName的指针参数的模板函数!"<<endl; }
sdghchj 2017-08-16
  • 打赏
  • 举报
回复
具体类型不能再特化了吧,此处不该是全特化而是偏特化,剩下的模板参数依旧要写。 特化时函数名后不要写特化类型 template <class T, int ID> void myswap(T &a, T &b) { T temp; temp=a; a=b; b=temp; cout<<"调用引用参数的函数模板!ID="<<ID<<endl; } template<int ID> void myswap(CName &a, CName &b)//编译报错 找不到匹配的函数模板声明 { char *temp=new char[strlen(a.GetName())+1]; strcpy(temp,a.GetName()); a.SetName(b.GetName()); b.SetName(temp); delete [] temp; cout<<"调用CName引用参数的模板函数"<<endl; } template <class T,int ID> void myswap(T *a, T *b) { T temp; temp=*a; *a=*b; *b=temp; cout<<"调用指针参数的函数模板!ID="<<ID<<endl; } template<int ID> void myswap(CName *a, CName *b)//编译报错 找不到匹配的函数模板声明 { char *temp=new char [strlen(a->GetName())+1]; strcpy(temp,a->GetName()); a->SetName(b->GetName()); b->SetName(temp); cout<<"调用CName的指针参数的模板函数!"<<endl; }

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧