读书人

问一个模板的小疑点

发布时间: 2012-03-01 10:25:46 作者: rapoo

问一个模板的小问题
(1)
template<类型形式参数表>返回类型 FunctionName(形式参数表){}
书:该定义只是对函数的描述,表示它每次能单独处理在类型形式参数中说明的数据类型。

好像每次定义的时候也都是这样的形式
template <class T> T FunctionName(T){T....}
用时
FunctionName(实在参数表);

好像每次 类型形式参数表 和 形式参数表 都是一样的
那我想问一下那这个<class T>要他有什么用呢 或者说它具体什么用呢?
如果不一样可以吗?
或者有形如
template <class A>返回类型 FunctionName(B){T....}的
可以吗


类型形式参数表 是否有形如 <int ,flaot ,double> 等 的吗 ?
(2)
template<类型形式参数表> className{};
template<类型形式参数表>返回类型 classNme<类型名表>::MemberFuncName(形式参数表){}

好像每次定义的时候也都是这样的形式
template<class T>class className
template<class T> 返回类型 classNme<T>::MemberFuncName(T){}

在这里 类型形式参数表 和 类型名表 有什么区别呢 或者说它们各是什么用呢?
如果定义的时候不一样可以吗?
或者有形如

template<class A> 返回类型 classNme<B>::MemberFuncName(C){}
的可以吗?










[解决办法]
你看的什么书?
看C++Primer或者C++Template
[解决办法]
那你自己觉得行吗?

让编译器告诉你
[解决办法]
template <class T > //T是Type的意思,当然也可用其他符号作类型名,但用到这个类型的地方作相应调整
T FunctionName(T a){T....}

template <class A >
A FunctionName(A a){T....}//这样是可以

template <class A >
返回类型 FunctionName(B a){T....}//这样是不行的,B是什么,T是什么





[解决办法]
template <class A >
A FunctionName(A a){A....}//这样是可以
[解决办法]
(1)对于:

template<class T > T FunctionName(T){T....}
用时:
FunctionName(实在参数表);

你问:

好像每次类型形式参数表和形式参数表都是一样的
那我想问一下那这个 <class T >要他有什么用呢 或者说它具体什么用呢?
如果不一样可以吗?
或者有形如
template <class A >返回类型 FunctionName(B){T....}的
可以吗?

答: 你的上述问题是针对一个模板函数。其中'<class T>'是该模板的模板形式参数表,用于限定该模板具体实现时所需绑定的类型。例如:

有: template<typename T> void fish6344(const T& _t));//模板声明;

编译器在为调用语句: 'fish6344(8);//调用模板函数!'定义出一个函数实体时,将以int作为实参定义出模板函数的具体实体:

void fish6344(const int& _t){ //.... };//这就是候捷博士所谓的'模板具现'!

可以看到,'class T'中的T充当了模板在未来可能的模板具体实现中,所有泛化类型参数的占位符。

对于你问"template <class A >返回类型 FunctionName(B){T....}的,可以吗?",其中的'class A'当然可以,但是'B'及后面的'T',编译器将会发出疑问:"未声明的标识符?" 或是"未声明的模板参数"...

对于形如'<int ,flaot ,double >'的所谓形参表是不行的,因为它们不是泛化类型,而是限定类型。只能这样:

例如: template<typneame T = int> void show(const T _t){};//......

(2)对于:
template <class T >class className
template <class T > 返回类型 classNme <T >::MemberFuncName(T){}

你问:
在这里类型形式参数表和类型名表有什么区别呢 或者说它们各是什么用呢?
如果定义的时候不一样可以吗?或者有形如

template <class A > 返回类型 classNme <B >::MemberFuncName(C){}
的可以吗?

答:首先,你所谓的'类型名表'是一个杜撰的术语(请原谅我的直率),我只能猜测你指的是
'classNme <T>::MemberFuncName(T){} '中的那个'<T'>,这是模板实参列表(见《C++ Common Knowledge》page153-条款45-模板术语)。它和模板形式参数表的区别是,它不是用于模板声明而是用于显式具体实现模板和模板特化,例如:

template<typename T>//形参表用于声明模板!
class Fish6344
{
};

1.显式具现:

Fish6344<char> _fh;//实参表用于显式具现一个模板类实例;

2.完全特化:

template<> class Fish6344<double>//实参表用于完全特化模板!
{
};

3.显式(局部)特化:

template<typename T> class Fish6344<T*>//实参表用于显式(局部)特化模板!
{
};

对于"template <class A > 返回类型 classNme <B >::MemberFuncName(C){}的可以吗?",和上述"template <class A >返回类型 FunctionName(B){T....}的,可以吗?"的回答同理。






读书人网 >C++

热点推荐