问一个模板的小问题
(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....}的,可以吗?"的回答同理。