3年C++经验看不明白的C++模板,摘自gnash项目

lixinustb 2009-08-03 11:36:01
3年C++经验看不明白的C++模板,摘自gnash项目
在gnash 0.8.5源码目录的libbase/tree.hh文件里有如下代码:
1 template <class T, class tree_node_allocator>
2 template <class iter>
3 iter tree<T, tree_node_allocator>::insert_after(iter position, const T& x)
4 {
5 tree_node* tmp = alloc_.allocate(1,0);
6 kp::constructor(&tmp->data, x);
7 tmp->first_child=0;
8 tmp->last_child=0;
9
10 tmp->parent=position.node->parent;
11 tmp->prev_sibling=position.node;
12 tmp->next_sibling=position.node->next_sibling;
13 position.node->next_sibling=tmp;
14
15 if(tmp->next_sibling==0) {
16 if(tmp->parent) // when inserting nodes at the head, there is no parent
17 tmp->parent->last_child=tmp;
18 }
19 else {
20 tmp->next_sibling->prev_sibling=tmp;
21 }
22 return tmp;
23 }

把第1、2两行合并为template <class T, class tree_node_allocator, class iter>,Ubuntu 8.04 + gcc 4.2.4编译报错。
哪位大侠能解释下第1、2两行的具体含义?为什么不能合并为一个template?谢谢!
...全文
513 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
knief不懂就问 2011-07-05
  • 打赏
  • 举报
回复
c++模板 很难哦
qihuanfengyun 2010-05-19
  • 打赏
  • 举报
回复
模板,容易吗???
gary_cai 2010-05-19
  • 打赏
  • 举报
回复
一般没用到模板的
linlu11 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 taodm 的回复:]

是3年还是1年*3,这是个问题。
[/Quote]

呵呵,
billow_zhang 2009-08-05
  • 打赏
  • 举报
回复
上面的朋友们把问题应该都解释得比较清楚了.我再从另一方面解释一下.
博主3年的C++,可能看的大部分的模版类中,方法的实现都是放在类里面的,比如,我将博主所说的例子的类编写如下:

template <class T, class tree_node_allocator>
classs tree {
template <class iter> insert_after(iter position, const T& x) {
.....
}

....
};

相信博主对于这样的写法,应该没有什么疑问吧? 通常类的模版也是这样的写法。但我们知道,C++中类的方法可以在类中只写定义,而将方法的实现写到类的外面。例如,上面的类可以只有 insert_after的定义:
template <class T, class tree_node_allocator>
classs tree {
template <class iter> insert_after(iter position, const T& x);
....
};

那么,insert_after方法的实现就要写到tree类的外面。那么该怎样写呢?是不是应该是下面这样:

template <class T, class tree_node_allocator>
template <class iter>
iter tree <T, tree_node_allocator>::insert_after(iter position, const T& x) {
.......
}

这不正是楼主所说的样子吗?所以,这是一个模版类的类外定义的函数实现的样式,再加上这个函数本身又是模版函数,把楼主大概搞晕了。
这回应该清楚了吧?!正如上面的朋友所说,第一个template是指tree类的模版,而第二个template是指 insert_after这个函数的模版。这两个模版是各有所指,不能合并的。

davidstack 2009-08-05
  • 打赏
  • 举报
回复
第一个是类模板,第二个是函数模板
zzcmx2008 2009-08-05
  • 打赏
  • 举报
回复
模板类中的模板成员函数
tomorrow_be_good 2009-08-05
  • 打赏
  • 举报
回复
1 template <class T, class tree_node_allocator> //是模板类的声明
2 template <class iter> // 是模板成员函数的声明
3 iter tree <T, tree_node_allocator>::insert_after(iter position, const T& x) {
....
}

babyboy 2009-08-04
  • 打赏
  • 举报
回复
第一模板属于类定义的模版,第二个模板是函数定义的模板,怎么能合并到一起?
你三年C++经验是不就Copy,Paste了?
babyboy 2009-08-04
  • 打赏
  • 举报
回复
第一模板属于类定义的模版,第二个模板是函数返回的参数定义,怎么能合并到一起?
你三年C++经验是不就Copy,Paste了?
kakashi0309 2009-08-04
  • 打赏
  • 举报
回复
模板也有类和函数区分 是这样的吧

huolin 2009-08-04
  • 打赏
  • 举报
回复
也是路过的,对模板这个的用途一直不是太清晰的
fallening 2009-08-04
  • 打赏
  • 举报
回复
无语
tree这个模板类是由两个模板参数的
insert_after是这个模板类的一个模板方法
应该是这么声明的
template <class T, class tree_node_allocator>
class tree
{
......
template <class iter>
iter insert_after(iter, const T&);
......
};


你在后边把它们合并之后,显然是跟之前类里边的声明冲突啊
xiexianyongAAAA 2009-08-04
  • 打赏
  • 举报
回复
模板是个好东西,兄弟还是应该花点时间看看。
kang315 2009-08-03
  • 打赏
  • 举报
回复
正在 模板 奋斗中
cowboytian 2009-08-03
  • 打赏
  • 举报
回复
模板类和模板函数
Vegertar 2009-08-03
  • 打赏
  • 举报
回复
这是模板类中的成员模板。
楼主还是多看看模板方面的书吧, C++ Templates: The Complete Guide
CrySleeper 2009-08-03
  • 打赏
  • 举报
回复
三年c++,从未正规接触过template的飘过....
taodm 2009-08-03
  • 打赏
  • 举报
回复
是3年还是1年*3,这是个问题。
yshuise 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jjcang 的回复:]
tree <T, tree_node_allocator>::insert_after
这2个参数是专门针对tree模板的,怎么能再加一个呢?
[/Quote]
只有重写模板了。
加载更多回复(4)

65,208

社区成员

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

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