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