c++ 模板类,方法返回值类型是typedef出来的,或者是auto,那么此方法在类外面如何定义?
程序员文章站
2022-06-07 11:58:22
c++ 模板类,方法返回值类型是typedef出来的,或者是auto,那么此方法在类外面如何定义? 比如方法max1的返回值是用typedef定义出来的mint,那么在类外如何定义这个方法呢? 尝试1: 尝试1的结果:编译不过,提示不能识别mint 尝试2: 尝试2的结果:依然编译不过 尝试3: 在 ......
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
上一篇: 炒米粉热量高吗,减肥的人可以吃吗