Chinaunix

标题: C++ template 语法 [打印本页]

作者: ryuken2000    时间: 2007-12-09 15:06
标题: C++ template 语法
最近在看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 编辑 ]
作者: vincol    时间: 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 编辑 ]
作者: doctorjxd    时间: 2007-12-09 19:24
template parameter 和 template template parameter 是不一样的。
作者: 飞灰橙    时间: 2007-12-09 19:29
奇怪,我记得这个编译不过吧
楼主用什么编译器?
作者: converse    时间: 2007-12-09 21:18
模板玩的不多,这个是模板默认参数,类似于函数默认参数.
作者: xiaomiao    时间: 2007-12-10 16:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: FightingWu    时间: 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,显然就不行了。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2