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