C++类模板实例化的问题
昨天学了关于类模板的显示实例化,偏特化的问题,然后上机一试就完全懵了。希望高手为我详细解释一下以下问题:类模板的显式实例化格式,要写在源文件里对么?(这样就可以在源文件中...
昨天学了关于类模板的显示实例化,偏特化的问题,然后上机一试就完全懵了。希望高手为我详细解释一下以下问题:类模板的显式实例化格式,要写在源文件里对么?(这样就可以在源文件中定义类模板的成员函数) 类模板的偏特化是不是要重新对类进行定义,可以把偏特化的成员函数写在源文件里再在源文件中对这个偏特化的类进行显式实例化么?一个类模板只能有一种偏特化格式么?求详细解释(灌水滚开,见到就举报!)
展开
2个回答
展开全部
其实无非两种,一种是具体化(又叫偏特化)一种是实例化(又叫全特话),对于具体化,就是
对模板的范围进一步压缩,并给这个更小的范围从新定义类成员(包括数据成员和方法)。对于实例化就是直接生成模板中某种实例(注意:同时给一个模板生成同一个实例化和具体化将报错)。举例:
#include<iostream>
#include<cstdio>
#include<stdlib.h>
using namespace std;
template <typename T1,typename T2>//#1
class A
{
int a;
public:
A (){cout<<"this is A<T1,T2> default constructor function!\n";}
};
template <typename T1>
class A<T1,int>//部分的具体化 #2
{
int b;
public:
A (){cout<<"this is A<T1,int> default constructor function!\n";}
};
template class A<int,char>;//显示的实例化,将直接生成该类型类定义
int main()
{
class A<int ,int> a;//隐式实例化 ,将隐式生成#2 的实例
class A<int ,char> b; //隐式实例化,将隐式生成#1的实例
return 0;
}
对模板的范围进一步压缩,并给这个更小的范围从新定义类成员(包括数据成员和方法)。对于实例化就是直接生成模板中某种实例(注意:同时给一个模板生成同一个实例化和具体化将报错)。举例:
#include<iostream>
#include<cstdio>
#include<stdlib.h>
using namespace std;
template <typename T1,typename T2>//#1
class A
{
int a;
public:
A (){cout<<"this is A<T1,T2> default constructor function!\n";}
};
template <typename T1>
class A<T1,int>//部分的具体化 #2
{
int b;
public:
A (){cout<<"this is A<T1,int> default constructor function!\n";}
};
template class A<int,char>;//显示的实例化,将直接生成该类型类定义
int main()
{
class A<int ,int> a;//隐式实例化 ,将隐式生成#2 的实例
class A<int ,char> b; //隐式实例化,将隐式生成#1的实例
return 0;
}
更多追问追答
追问
那么显式实例化和模板函数的定义可以写在一个源文件里而main函数在另一个源文件里么?还有 同时给一个模板生成同一个实例化和具体化将报错 这句话再解释一下好么,谢谢
追答
1)是源文件还是头文件呢?如果是源文件那有根本没有限制。因为只要用连接器连起来他们就和在同一个源文件是没区别的,但是头文件则不建议,因为当头文件多次写入不同源文件时候将重复定义。
2)template class A;//显示的实例化,将直接生成 A的类定义
template class A//试图使用具体化生成 A的类定义 ,编译器报错
{
int b;
public:
A (){cout default constructor function!\n";}
};
把上面语句嵌入全局域,编译器将报错,对类重复定义。删去其中一个就不会出错了
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<iostream>
using namespace std;
template <class T>
class max
{
private:
T** num;
int r,l;
public:
max()
{
printf("输入矩阵的行数及列数: ");
scanf("%d %d",&r,&l);
printf("依次输入矩阵的元素:\n");
num=(T**)malloc(sizeof(T*)*r);
for(int i=0;i<r;i++)
{
num[i]=(T*)malloc(sizeof(T)*l);
for(int j=0;j<l;j++)
{
cin>>num[i][j];
}
}
}
friend void print(max<T> a)
{
printf("矩阵共%d行%d列:\n",a.r,a.l);
for(int i=0;i<a.r;i++)
{
for(int j=0;j<a.l;j++)
{
cout<<a.num[i][j]<<" ";
}
printf("\n");
}
}
};
int main()
{
max<float> mi;
print(mi);
return 0;
}
如上就可以了。
错误主要是输入的格式问题。
scanf("%d",&num[i][j]);
这种是只可以输入整数的。
改成
cin>>num[i][j];
如有问题可以空间留言,或hi留言。
以上回答你满意么?
using namespace std;
template <class T>
class max
{
private:
T** num;
int r,l;
public:
max()
{
printf("输入矩阵的行数及列数: ");
scanf("%d %d",&r,&l);
printf("依次输入矩阵的元素:\n");
num=(T**)malloc(sizeof(T*)*r);
for(int i=0;i<r;i++)
{
num[i]=(T*)malloc(sizeof(T)*l);
for(int j=0;j<l;j++)
{
cin>>num[i][j];
}
}
}
friend void print(max<T> a)
{
printf("矩阵共%d行%d列:\n",a.r,a.l);
for(int i=0;i<a.r;i++)
{
for(int j=0;j<a.l;j++)
{
cout<<a.num[i][j]<<" ";
}
printf("\n");
}
}
};
int main()
{
max<float> mi;
print(mi);
return 0;
}
如上就可以了。
错误主要是输入的格式问题。
scanf("%d",&num[i][j]);
这种是只可以输入整数的。
改成
cin>>num[i][j];
如有问题可以空间留言,或hi留言。
以上回答你满意么?
追问
精神病吧,脑残
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询