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

c++ 模板类,方法返回值类型是typedef出来的,或者是auto,那么此方法在类外面如何定义?的更多相关文章

  1. java 反射获取方法返回值类型

    //ProceedingJoinPoint pjp //获取方法返回值类型 Object[] args = pjp.getArgs(); Class<?>[] paramsCls = ne ...

  2. IEnumerable<T>作为方法返回值类型——建议通过yield return返回

    若IEnumerable<T>作为方法返回值的类型,则建议使用“迭代”模式(yield return) private IEnumerable<TwoLevelTreeNodeVie ...

  3. Java泛型:利用泛型动态确认方法返回值类型

    根据泛型类型动态返回对象 public <T extends PackObject> T unPackMessage(String interfaceCode, String respVa ...

  4. C#中部分方法返回值类型为什么只能是void?

    这个问题答案选至<C#入门经典> 如果方法具有返回类型,那就可以作为表达式的一部分: x=Manipulate(y,z); 如果没有给部分方法提供实现代码,编译器就会在使用该方法的所有地方 ...

  5. MVC方法的返回值类型

    MVC方法返回值类型 ModelAndView返回值类型: 1.当返回为null时,页面不跳转. 2.当返回值没有指定视图名时,默认使用请求名作为视图名进行跳转. 3.当返回值指定了视图名,程序会按照 ...

  6. C# 方法返回值的个数

    方法返回值类型总的来说分为值类型,引用类型,Void 有些方法显示的标出返回值 public int Add(int a,int b) { return a+b; } 有些方法隐式的返回返回值,我们可 ...

  7. Java学习笔记13---如何理解“子类重写父类方法时,返回值若为类类型,则必须与父类返回值类型相同或为其子类”

    子类重新实现父类的方法称重写:重写时可以修改访问权限修饰符和返回值,方法名和参数类型及个数都不可以修改:仅当返回值为类类型时,重写的方法才可以修改返回值类型,且必须是父类方法返回值的子类:要么就不修改 ...

  8. Spring MVC学习之三:处理方法返回值的可选类型

    http://flyer2010.iteye.com/blog/1294400 ———————————————————————————————————————————————————————————— ...

  9. Java常见面试题02-方法重写和方法重载的区别?方法重载能改变返回值类型吗?

    方法重写和方法重载的区别?方法重载能改变返回值类型吗?       A:Override方法重写和Overload方法重载的区别? Overload是否可以改变返回值类型?可以 方法重写 •  子类中 ...

随机推荐

  1. Python使用Flask实现RESTful API,使用Postman工具、requests库测试接口

    RESTful是一种API设计规范.在RESTful架构中,主要使用POST,DELETE,PUT和GET四种HTTP请求方式分别对指定的URL资源进行增删改查操作. RESTful之前的做法: /u ...

  2. 微信支付和微信支付通知基于sdk的说明(2)

    前期准备工作 微信商户账户/密码(获取appid等信息) 微信公众号账户/密码(获取cert证书等信息,不做线上退款不需要证书) 下载php支付demo 从商户平台进入的话是以下界面或者直接搜索公众号 ...

  3. Mac下编译libpomelo静态库,并在cocos2dx项目中引用

    最近在学习cocos2dx的过程中需要和服务器进行交互,所以这几天在学习libpomelo静态库的编译和使用.之前在windows系统下编译libpomelo,并在VS中引入比较顺利:但是,目前对Ma ...

  4. http返回头中content-length与Transfer-Encoding: chunked的问题释疑

    先说说问题出现的背景:        公司服务器与手机客户端交互,客户端请求一个动态生成的XML文件,在用firebug查看http响应头的时候,有时候发现有content-length属性,有时候没 ...

  5. LeetCode 307. 区域和检索 - 数组可修改

    地址 https://leetcode-cn.com/problems/range-sum-query-mutable/ 题目描述给定一个整数数组  nums,求出数组从索引 i 到 j  (i ≤  ...

  6. 新书上线:《Spring Boot+Spring Cloud+Vue+Element项目实战:手把手教你开发权限管理系统》,欢迎大家买回去垫椅子垫桌脚

    新书上线 大家好,笔者的新书<Spring Boot+Spring Cloud+Vue+Element项目实战:手把手教你开发权限管理系统>已上线,此书内容充实.材质优良,乃家中必备垫桌脚 ...

  7. onload()方法只能在body标签中调用吗?怎么调用多个多个方法?

    第一个问题: onload()方法并非只能在body标签中调用的,还可以在js中用window.onload = function() {函数名};来调用:另外img等标签也支持onload方法. 支 ...

  8. [题解向] CF#Global Round 1の题解(A $\to$ G)

    这里是总链接\(Link\). \(A\) 题意:求\(\sum_{i=1}^{k} a_i\times b^{k-i}\)的奇偶性, \(k = \Theta(n \log n)\) --其实很容易 ...

  9. 成为杰出Java开发人员的10个步骤

    在优锐课的学习分享中,讨论了如果你是Java开发人员并且对技术充满热情,则可以按照以下十个步骤进行操作,这可以使你成为杰出的Java开发人员. 1.具有扎实的基础和对OO原理的理解 对于Java开发人 ...

  10. python接口自动化8-unittest框架使用

    前言 unittest:Python单元测试框架,基于Erich Gamma的JUnit和Kent Beck的sSmalltalk测试框架. 一.unittest框架基本使用 unittest需要注意 ...