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
c++ 模板类,方法返回值类型是typedef出来的,或者是auto,那么此方法在类外面如何定义?的更多相关文章
- java 反射获取方法返回值类型
//ProceedingJoinPoint pjp //获取方法返回值类型 Object[] args = pjp.getArgs(); Class<?>[] paramsCls = ne ...
- IEnumerable<T>作为方法返回值类型——建议通过yield return返回
若IEnumerable<T>作为方法返回值的类型,则建议使用“迭代”模式(yield return) private IEnumerable<TwoLevelTreeNodeVie ...
- Java泛型:利用泛型动态确认方法返回值类型
根据泛型类型动态返回对象 public <T extends PackObject> T unPackMessage(String interfaceCode, String respVa ...
- C#中部分方法返回值类型为什么只能是void?
这个问题答案选至<C#入门经典> 如果方法具有返回类型,那就可以作为表达式的一部分: x=Manipulate(y,z); 如果没有给部分方法提供实现代码,编译器就会在使用该方法的所有地方 ...
- MVC方法的返回值类型
MVC方法返回值类型 ModelAndView返回值类型: 1.当返回为null时,页面不跳转. 2.当返回值没有指定视图名时,默认使用请求名作为视图名进行跳转. 3.当返回值指定了视图名,程序会按照 ...
- C# 方法返回值的个数
方法返回值类型总的来说分为值类型,引用类型,Void 有些方法显示的标出返回值 public int Add(int a,int b) { return a+b; } 有些方法隐式的返回返回值,我们可 ...
- Java学习笔记13---如何理解“子类重写父类方法时,返回值若为类类型,则必须与父类返回值类型相同或为其子类”
子类重新实现父类的方法称重写:重写时可以修改访问权限修饰符和返回值,方法名和参数类型及个数都不可以修改:仅当返回值为类类型时,重写的方法才可以修改返回值类型,且必须是父类方法返回值的子类:要么就不修改 ...
- Spring MVC学习之三:处理方法返回值的可选类型
http://flyer2010.iteye.com/blog/1294400 ———————————————————————————————————————————————————————————— ...
- Java常见面试题02-方法重写和方法重载的区别?方法重载能改变返回值类型吗?
方法重写和方法重载的区别?方法重载能改变返回值类型吗? A:Override方法重写和Overload方法重载的区别? Overload是否可以改变返回值类型?可以 方法重写 • 子类中 ...
随机推荐
- SSM框架中mapper和mapping.xml文件在同一个包下需要的配置
前言 当我们在开发过程中,由于maven项目本身的限制,我们不能直接把我们的mapper.xml文件和对应mapper.java接口文件放到一起,也就是不能直接放在java包中,如图: 因为mave ...
- Angular回顾(1)
一.前端基础 HTML:超文本标记语言,文档排版. DOM:文档对象模型. JS: 脚本语言,解释执行:动态操作DOM,服务器交互,用户交互. CSS:层叠样式表. 二.Angular前提 TypeS ...
- MVC、MVP与MVVM架构模式
MVC(Model View Controller): View 层是界面,Model 层是业务逻辑,Controller 层用来调度 View 层和 Model 层, 将用户界面和业务逻辑合理的组织 ...
- [Go] go中的goto语句跳到指定标签
比如下面的语句goto TOP ,其中TOP就是自己的自定义的标签,下面的TOP:就是要执行的代码段一般用在需要两层循环的地方,里面goto再跳回上面去 ; i < ; i++ { { goto ...
- WPF datagrid 列按钮使用
原文:WPF中使用DataGrid时操作列按钮问题 <DataGrid x:Name="datagrid" AutoGenerateColumns="Fal ...
- Java编译器的2点优化
优化1 对于byte/short/char三种类型来说,如果右侧赋值的数值没有超过范围,那么javac编译器将会自动隐含地为我们补上一个(byte)(short)(char). 如果没有超过左侧的范围 ...
- Golang面向并发的内存模型
Import Advanced Go Programming 1.5 面向并发的内存模型 在早期,CPU都是以单核的形式顺序执行机器指令.Go语言的祖先C语言正是这种顺序编程语言的代表.顺序编程语言中 ...
- windows 10使用vscode进行远程代码开发 | tutorial to use vscode for remote development using ssh on windows
本文首发于个人博客https://kezunlin.me/post/c93b6ba6/,欢迎阅读最新内容! tutorial to use vscode for remote development ...
- 面试必问的Spring IOC详解
广义的 IOC IoC(Inversion of Control) 控制反转,即“不用打电话过来,我们会打给你”. 两种实现: 依赖查找(DL)和依赖注入(DI). IOC 和 DI .DL 的关系( ...
- Razor 进度的变速
视频录制了 .但发现 进度太慢了,对于当下市场 和我们的学习进度基本不会成正比关系了.所以,改一下 我们教程的实现方式. 我和大家 一起 看一下关联的技术的点, 提出我们要做的 内容 动手实践, 可能 ...