zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Cheatsheet: 2018 11.01 ~ 2019 02.28
    Cheatsheet: 2018 08.01 ~ 2018 10.31
    Cheatsheet: 2018 05.01 ~ 07.31
    Cheatsheet: 2018 04.01 ~ 04.30
    stb_image multiple definition of first defined here 多文件包含问题
    NanoPi arm架构下的程序 ./ 运行黑屏 Qt环境可运行
    opencv3.4.9 + armv7 + arm-linux-gnueabihf交叉编译
    NIVIDIA Tegra K1 QWT安装使用问题和解决办法
    7.17日报
    7.16日报
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/11845696.html
Copyright © 2011-2022 走看看