当前位置: 移动技术网 > IT编程>开发语言>C/C++ > c++ 模板类,方法返回值类型是typedef出来的,或者是auto,那么此方法在类外面如何定义?

c++ 模板类,方法返回值类型是typedef出来的,或者是auto,那么此方法在类外面如何定义?

2019年11月13日  | 移动技术网IT编程  | 我要评论

番茄的小说,国家公务员报名时间,两朝太岁

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;
}

decltype使用参考:https://www.cnblogs.com/qg-whz/p/4952980.html

c/c++ 学习互助qq群:877684253

本人微信:xiaoshitou5854

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网