template 与 template在用法上有什么区别吗?

duanlixing 2010-03-18 12:07:14
template <class T> 和 template<typename T>都可以用来定义模板函数和模板类,但是他们二者到底有什么区别呢?
...全文
3446 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这里的高手很厉害。mark
  • 打赏
  • 举报
回复
很抽象啊。不好懂。
哈哈王戈多 2011-09-04
  • 打赏
  • 举报
回复
哎,我也在搞这个,搞不懂,才刚开始接触
duanlixing 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 thefirstz 的回复:]
typename关键字是后来添加进来的,用class有点和类混淆,typename的另一个作用是定义一个变量
[/Quote]
如何定义?
昵称很不好取 2010-03-18
  • 打赏
  • 举报
回复
typename关键字是后来添加进来的,用class有点和类混淆,typename的另一个作用是定义一个变量
mstlq 2010-03-18
  • 打赏
  • 举报
回复
duanlixing 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fancymouse 的回复:]
这里是没区别的。当然typename还有另一个用法。
[/Quote]
你就别卖官子了,还有其他什么用法啊?
FancyMouse 2010-03-18
  • 打赏
  • 举报
回复
这里是没区别的。当然typename还有另一个用法。
fox000002 2010-03-18
  • 打赏
  • 举报
回复
只要能用,两者就没有差别
baihacker 2010-03-18
  • 打赏
  • 举报
回复
http://hi.baidu.com/feixue/blog/item/d9f79925d8a45b6c34a80fce.html
关于模板中不常见的语法,也就是对8楼代码的补充。
pengzhixi 2010-03-18
  • 打赏
  • 举报
回复
呵呵,来学习
lovesi3344 2010-03-18
  • 打赏
  • 举报
回复
typename关键字是后来添加进来的,用class有点和类混淆,typename的另一个作用是定义一个变量
talentbibby 2010-03-18
  • 打赏
  • 举报
回复
好像都是函数模板吧,typname和class都是函数模板名,class好像跟类混淆了
大V雪 2010-03-18
  • 打赏
  • 举报
回复
typename关键字是后来添加进来的,用class有点和类混淆,typename的另一个作用是定义一个变量
baihacker 2010-03-18
  • 打赏
  • 举报
回复
编译要求为vc9,gcc version 4.4.0 (TDM-1 mingw32)不支持其中的fuck2
baihacker 2010-03-18
  • 打赏
  • 举报
回复


//总结一点点模板中比较怪的语法

template<typename X>
struct A;

template<typename T, typename T1>
void fuck1(A<T1>);

template<typename T, typename T1>
void fuck2(A<T1>);

template<typename X>
struct A
{
typedef int* intptr;
//类模板的函数模板
template<typename Y> void fuck();
//绑定的模板友元,注意这里的第一个参数绑定到了int
friend void fuck1 <int, X> (A);
//非绑定的模板友元
template<typename T, typename T1> friend void fuck2(A);

private:
int v;
};

//模板的模板参数
template<template <typename> class T>//class不能换
class B{};

//示例typename和template的用法
template<typename T>
void foo(T t)
{
typename T::intptr x;//typename不能省
t.template fuck<int>();//template不能省
}

//类模板的函数模板定义语法
template<typename X>
template<typename Y>
void A<X>::fuck(){}

//定义这两个函数模板
template<typename T, typename T1>
void fuck1(A<T1> a){a.v = 1;}

template<typename T, typename T1>
void fuck2(A<T1> a){a.v = 1;}

//显示实例化
template class A<int>;
//template void fuck1<float>(A<float>);出错
template void fuck1<int>(A<int>);
template void fuck2<A<int>, A<double> >(A<A<double> >);

int main()
{
A<int> a;
B<A> b;
fuck1<int>(a);
//fuck1<float>(a);出错
fuck2<int>(a);
fuck2<double>(a);
return 0;
}
baihacker 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 duanlixing 的回复:]
引用 5 楼 thefirstz 的回复:
typename关键字是后来添加进来的,用class有点和类混淆,typename的另一个作用是定义一个变量

如何定义?
[/Quote]
在模板的模板参数的时候必须用class.

template<typename X>
class A
{
public:
typedef int* intptr;
template<typename Y> void fuck(){}
};
template<template <typename> class T>//class不能换
class B{};
template<typename T>
void foo(T t)
{
typename T::intptr x;//typename不能省
t.template fuck<int>();//template不能省
}
int main()
{
B<A> a;
return 0;
}

64,649

社区成员

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

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