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

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

  • 好比方法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: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

c/c++ 學習互助QQ羣:877684253

本人微信:xiaoshitou5854

相關文章
相關標籤/搜索