c++ 模板类,方法返回值类型是typedef出来的

879 阅读1分钟
c++ 模板类,方法返回值类型是typedef出来的,或者是auto,那么此方法在类外面如何定义?
  • 比如方法max1的返回值是用typedef定义出来的mint,那么在类外如何定义这个方法呢?
template
<
typename
T>struct aa{
typedef
int
mint; mint max1(T a); auto max2(T a) -> decltype(int(1)); mint data;};
尝试1:
template
<
typename
T>mint aa<T>::max1(T a){}
尝试1的结果:编译不过,提示不能识别mint
尝试2:
template
<
typename
T>aa<T>::mint aa<T>::max1(T a){}
尝试2的结果:依然编译不过
尝试3: 在前面加typename关键字
template
<
typename
T>
typename
aa<T>::mint aa<T>::max1(T a){}
尝试3的结果:编译通过
  • 比如方法max2的返回值是auto,那么在类外如何定义这个方法呢?
    使用decltype(c++11特性)。让decltype来推到出auto的类型

template
<
typename
T>struct aa{
typedef
int
mint; mint max1(T a); auto max2(T a) -> decltype(int(1)); mint data;};
template
<
typename
T>
typename
aa<T>::mint aa<T>::max1(T a){ }
template
<
typename
T>
auto
aa<T>::max2(T a) ->
decltype
(
int
(1)){
return
a;}int main(){ aa<
int
> a;
auto
x = a.max2(12);
std
::
cout
<< x <<
std
::
endl
;}
  • decltype用途最广的地方是在泛型编程中结合auto,用于追踪函数的返回值类型
    比如有一下方法,有2个模板参数Tx和Ty,返回值就2个模板参数类型对象的加法的和。这种情况,此函数的返回值是写Tx呢,还是写Ty呢?写哪个都不行,所以必须用decltype(_Tx + Ty)来推到出来。
    template
    <
    typename
    _Tx,
    typename
    _Ty>auto add(_Tx x, _Ty y)->decltype(_Tx*_Ty){
    return
    x*y;}