c++ 模板类,方法返回值类型是typedef出来的,或者是auto,那么此方法在类外面如何定义?html
template<typename T> struct aa{ typedef int mint; mint max1(T a); auto max2(T a) -> decltype(int(1)); mint data; };
尝试1:c++
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的结果:编译经过c++11
好比方法max2的返回值是auto,那么在类外如何定义这个方法呢?code
使用decltype(c++11特性)。让decltype来推到出auto的类型htm
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使用参考:http://www.javashuo.com/article/p-ohzkpifa-cy.html