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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM