关于c++ primer中关于模板成员函数的疑问
看了两天还是没明白,参考essential c++更晕了。
chap 16.3 类模板的成员函数:
被定义在类模板定义之外的成员函数必须使用特殊的语法,来指明它是一个类模板的成
员成员.函数定义的前面必须加上关键字template 以及模板参数.例如在类模板定义之外
可定义Queue 构造函数如下:
template <class Type>
class Queue {
public:
Queue( );
private:
// ...
};
template <class Type>
inline Queue<Type>::
Queue( ) { front = back = 0; }
Queue 的第一次出现在域操作符::之前后面紧跟着模板参数表,这表示成员函数所属
的类模板.Queue 的第二次出现紧跟在域操作符之后表示构造函数的名字.它的名字可
以(但是不必)紧跟在模板参数表后面.
我被最后一句困住了,如何才能让queue()紧跟在模板参数表后面?
我试过类似 <class Type> Queue(),<Type>Queue(),编译都不能通过,不知道如何才能实现
这个"不必紧跟在模板参数表后面"的实现?能否给出code scriptlet?
问题点数:100、回复次数:9Top
1 楼leonting()回复于 2006-02-23 00:09:43 得分 0
下了原版看了看,似乎是翻译问题。
不必紧跟在模板参数表后面:对应
Its name may but does not need to be followed by the
template parameter list.
那就应该是:也许可以但不必要跟模板参数表在后面。
同样我试过Queue<T>(),也是不行的。
不知道是不是我的领悟能力的问题,我只能理解模板成员函数只有
template <class Type>
inline Queue<Type>::
Queue( ) { front = back = 0; }
这样一种写法。
请指点我,万分感谢!Top
2 楼missedyou_1984(执著)回复于 2006-02-23 17:59:20 得分 1
不才呀
建议你看一下
STL
Top
3 楼xzgyb(老达摩)回复于 2006-02-24 09:28:20 得分 25
就是说你也可以这样写,但是不必要
template <class Type>
inline Queue<Type>::
Queue<Type>( ) { front = back = 0; }
Top
4 楼ugg(逸学堂(exuetang.net))回复于 2006-02-24 09:48:14 得分 35
template<class T>
class AA
{
public:
AA();
};
template<class T>
AA<T>::AA<T>()// 注意有两个AA<T>
{
}
// 编译成功
template<class T>
class AA
{
public:
AA();
};
template<class T>
AA<T>::AA()// 注意
{
}
也编译成功。
区别就是上面的理解Top
5 楼ox_thedarkness()回复于 2006-02-24 10:01:14 得分 9
同上,后面一句翻反了.... 楼主看原版罢
The first occurrence of Queue(the one preceding the scope operator ::)is followed by the template parameter list. This represents the class template to which the member function belongs. The second occurrence of Queue in the constructor definition(the one following the scope operator) represents the name of the constructor member function. Its name may but does not need to be followed by the template parameter list.
第二个Queue(在作用域符号后面的那个)是构造函数这个成员函数的名称。它的名字后面可以跟模板参数表,但这不是必须的。Top
6 楼leonting()回复于 2006-02-24 10:57:27 得分 0
谢谢各位回复,确定了我的理解,但是我还是有疑问。请看代码:
//----------------listtmp.h---------------------------------
# include<iostream.h>
template
<class T> // 类型形式参数表
class
List //className
{
public:
List();
void Add(T&);
void Remove(T&);
T* Find(T&);
void PrintList();
~List();
protected:
struct Node{
Node* pNext;
T* pT;
};
Node* pFirst;
};
template
<class T> //类型形式参数表
List //className
<T> //类型名表
::List()
{
pFirst = 0;
}
template<class T> void List<T> :: Add(T& t){
Node* temp = new Node; //1
temp -> pT = &t; //2
temp->pNext = pFirst; //3
pFirst = temp; //4
}
template<class T> void List<T>::Remove(T& t){
Node* q = 0; //用来定位待删结点
if(*(pFirst->pT) == t){
q = pFirst;
pFirst = pFirst -> pNext;
}
else{
for(Node* p=pFirst; p->pNext; p=p->pNext){
if(*(p->pNext->pT) == t){
q = p->pNext;
p->pNext = q->pNext; //5
break;
}
}
}
if(q){
delete q->pT; //6
delete q; //7
}
}
template<class T> T* List<T>::Find(T& t){
for(Node* p=pFirst; p; p=p->pNext){
if(*(p->pT) == t)
return p->pT;
}
return 0;
}
template<class T> void List<T>::PrintList(){
for(Node* p=pFirst; p; p=p->pNext){
cout<<*(p->pT)<<" ";
}
cout<<endl;
}
template<class T> List<T>::~List(){
Node* p;
while(p = pFirst){
pFirst = pFirst->pNext;
delete p->pT;
delete p;
}
}
//------------------------------------------------------------
我修改Add函数,使其成为Add<T>形式,vc6中编译不能通过,这是为什么呢?
Top
7 楼xzgyb(老达摩)回复于 2006-02-24 11:08:39 得分 30
Add是一个普通的成员函数,没有这种Add<T>的写法
它不同于构照函数
它不同于构照函数和析构函数
构照函数和析构函数由于必须用这个类名来命名
所以如果严格说来模板中的构造和析购函数都要加上<T>
如
template <class T>
class A
{
public:
A<T>() {}
~A<T>() {}
};
c++提供了这种方便,可以不用加
但普通的成员函数则不应该加了Top
8 楼leonting()回复于 2006-02-24 11:11:14 得分 0
上面一段代码修改list()为list<T>(),编译通过。
修改template<class T> void List<T> :: Add(T& t)为template<class T> void List<T> :: Add<T>(T& t),编译报错。
是否c++primer中这段解释只对构造函数起作用呢?Top
9 楼leonting()回复于 2006-02-24 11:12:40 得分 0
谢谢老达摩,恢复比我提问还快。让我彻底理解了!Top




