免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5401 | 回复: 6
打印 上一主题 下一主题

[C++] C++ template 语法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-09 15:06 |只看该作者 |倒序浏览
5可用积分
最近在看C++代码的时候,发现了如下一个模板类的声明:
template <class Key,  class T, class Compare = std::less<Key>,  template <class> class Alloc = std::Allocator>
class MyMap : protected std::map<Key, T, Compare, Alloc> {
......
};

对于这个模板类的第四个参数,template <class> class Alloc = std::Allocator,这种写法还是第一次遇到,不太明白其中的含义,是否这种写法强调class Alloc也必须是一个模板类呢?如果不这么写,而简单的写class Alloc = std::Allocator应该也没有什么问题吧?

请高手解答。

[ 本帖最后由 ryuken2000 于 2007-12-9 15:09 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-12-09 19:00 |只看该作者
不是什么强调,因为std::allocator本身就要有模板参数,他和前面的key,T不一样,Alloc是一个“指代模板类的参数”! 应该是语法需要吧!


举个例子:
template<class T>
class CA {};

template<class T>
class CB {};
你可以这样用:CB cb<int>;
但是这样是错的: CB cb<CA>;因为CA和int不通,CA要有模板参数。
要把CB的模板参数改成:
template< template<class> class T>
class CB {};
才能用CB  cb<CA>

[ 本帖最后由 vincol 于 2007-12-10 13:28 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-12-09 19:24 |只看该作者
template parameter 和 template template parameter 是不一样的。

论坛徽章:
0
4 [报告]
发表于 2007-12-09 19:29 |只看该作者
奇怪,我记得这个编译不过吧
楼主用什么编译器?

论坛徽章:
0
5 [报告]
发表于 2007-12-09 21:18 |只看该作者
模板玩的不多,这个是模板默认参数,类似于函数默认参数.

论坛徽章:
0
6 [报告]
发表于 2007-12-10 16:37 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2007-12-23 21:45 |只看该作者
emplate <class Key,  class T, class Compare = std::less<Key>,  template <class> class Alloc = std::Allocator>
属于类模板中有模板参数的情况。其中的class T 中的class不能被typename代替。
由于用不到“模板的模板参数的”模板参数,故省略为template<class>.
在类里可以定义如Alloc<T> oneobject,要是去掉template<class>,直接写成class Allocl=std::Allocator,显然就不行了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP