分析:两种不同的函数模板写法,其中一种为何不行

接上篇:

利用类型,做函数模板的“重载”-CSDN博客

 

比较两种模板的写法

为什么左边不可行:

注意,左边的写法的第二个模板参数,是默认参数的形式。为何这里采取了默认参数的形式呢,本意是想让编译器来走sfine的流程,用户不用指明具体的类型。但就是这一点让最后的编译失败

当编译到test451(1);时,实例化成了

??$test451@HH@@YAXH@Z,也就是void __cdecl test451<int,int>(int)

template <typename Sequence, typename=int>
    void test451(Sequence x)
{
    std::cout << "1" << std::endl;
}

当编译到test451(1.0);时,按理说应该生成:void __cdecl test451<double,double>(double)

template <typename Sequence, typename=double>
    void test451(Sequence x)
{
    std::cout << "1" << std::endl;
}

但可能编译器不这么想,却给了一个“error C2995: “void test451(Sequence)”: 函数模板已经定义”的编译错误。明明void __cdecl test451<int,int>(int)和void __cdecl test451<double,double>(double)并不一样啊。

用C++ Insights分析

祭出C++ Insights吧,让它来分析分析下面的代码,看能否给出更多信息:

#include <cstdio>
#include <iostream>
#include <type_traits>template <typename Sequence, typename=typename std::enable_if<std::is_same<Sequence, int>::value, int >::type>void test451(Sequence x)
{std::cout << "1" << std::endl;
}template <typename Sequence, typename =typename std::enable_if<std::is_same<Sequence, double>::value, int >::type >void test451(Sequence x)
{std::cout << "1" << std::endl;
}template <typename Sequence, typename =typename std::enable_if<std::is_same<Sequence, std::wstring>::value, int >::type >void test451(Sequence x)
{std::cout << "1" << std::endl;
}int main()
{test451(1);test451(1.0);std::wstring str;test451(str);
}

给出的结论如下:

/home/insights/insights.cpp:13:5: error: template parameter redefines default argument
   13 |     typename std::enable_if<std::is_same<Sequence, double>::value >::type>
      |     ^

意思是,在实例化double的情况的时候,提示默认参数被重定义了。

/home/insights/insights.cpp:6:5: note: previous default template argument defined here
    6 |     typename std::enable_if<std::is_same<Sequence, int>::value >::type>
      |     ^

之前实例化的在这里。(int版本)

/home/insights/insights.cpp:14:10: error: redefinition of 'test451'
   14 |     void test451(Sequence x)
      |          ^
/home/insights/insights.cpp:7:10: note: previous definition is here
    7 |     void test451(Sequence x)
      |          ^

double版本的test451重新定义了int版本的test451。(所以报错)

果然是默认参数的问题。用int实例化的时候,默认参数是int,

/home/insights/insights.cpp:13:5: error: template parameter redefines default argument13 |     typename std::enable_if<std::is_same<Sequence, double>::value, int >::type >|     ^
/home/insights/insights.cpp:6:5: note: previous default template argument defined here6 |     typename std::enable_if<std::is_same<Sequence, int>::value, int >::type>|     ^
/home/insights/insights.cpp:14:10: error: redefinition of 'test451'14 |     void test451(Sequence x)|          ^
/home/insights/insights.cpp:7:10: note: previous definition is here7 |     void test451(Sequence x)|          ^
/home/insights/insights.cpp:28:5: error: no matching function for call to 'test451'28 |     test451(1);|     ^~~~~~~
/home/insights/insights.cpp:14:10: note: candidate template ignored: requirement 'std::is_same<int, double>::value' was not satisfied [with Sequence = int]14 |     void test451(Sequence x)|          ^
/home/insights/insights.cpp:29:5: error: no matching function for call to 'test451'29 |     test451(1.0);|     ^~~~~~~
/home/insights/insights.cpp:14:10: note: candidate template ignored: substitution failure [with Sequence = double, $1 = typename std::enable_if<std::is_same<double, double>::value, int>::type]14 |     void test451(Sequence x)|          ^
/home/insights/insights.cpp:32:5: error: no matching function for call to 'test451'32 |     test451(str);|     ^~~~~~~
/home/insights/insights.cpp:14:10: note: candidate template ignored: requirement 'std::is_same<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>, double>::value' was not satisfied [with Sequence = std::wstring]14 |     void test451(Sequence x)|          ^
5 errors generated.
Error while processing /home/insights/insights.cpp.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/787095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java学习之类和对象、内存底层

目录 表格结构和类结构 表格的动作和类的方法 与面向过程的区别 具体实现 对象和类的详解 类的定义 属性&#xff08;field 成员变量&#xff09; 方法 示例--编写简单的学生类 简单内存分析(理解面向对象) 构造方法(构造器 constructor) 声明格式&#xff1a; 四…

super关键字的使用总结

一、super关键字的使用1. 为什么需要super&#xff1f;举例1&#xff1a;子类继承父类以后&#xff0c;对父类的方法进行了重写&#xff0c;那么在子类中&#xff0c;是否还可以对父类中被重写的方法进行调用&#xff1f; 可以&#xff01;举例2&#xff1a;子类继承父类以后&a…

一个页面实现两个滚动条【前端】

一个页面实现两个滚动条【前端】 前言版权推荐一个页面实现两个滚动条最后 前言 2024-4-2 12:54:46 以下内容源自《【前端】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://jsss-1.blog.csdn.net …

【zlm】音视频流与音频流合并的设计

目录 设想一 设想二 方案三 关键技术 测试语句 测试脚本 参考文档 设想一 //开始录制_option.mp4_save_path custom_path;_option.mp4_max_second max_second;vector<Track::Ptr> mytracks getTracks();auto src MediaSource::find( DEFAULT_VHOST, "1&quo…

练习14 Web [极客大挑战 2019]Upload

phtml格式绕过&#xff0c;burp修改content-type绕过&#xff0c;常见的文件上传存放目录名 题目就叫upload&#xff0c;打开靶机 直接上传一个图片格式的一句话木马&#xff0c;返回如下&#xff1a; 提交练习5和9中的两种可以执行图片格式php代码的文件&#xff0c;修改con…

生成式人工智能对信息安全的挑战及解决方案

概念 生成式人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;基于训练数据以及用户提示词创建新内容的能力&#xff0c;在教育、娱乐、巡检、医疗保健和科学研究等多个领域提供变革潜力&#xff0c;激发起前所未有的关注度和创造力浪潮&#xff0c;引发…

25.死锁

一个线程如果需要同时获取多把锁&#xff0c;就容易产生死锁。 t1线程获得A对象锁&#xff0c;接下来想获取B对象的锁。 t2线程获得B对象锁&#xff0c;接下来想获取A对象的锁。 /*** 死锁demo* param args*/public static void main(String[] args) {Object a new Object(…

如何使用【知乎引流软件工具】进行有效引流

知乎&#xff0c;这个内容平台&#xff0c;无疑是品牌和创作者们的乐园。 品牌能在这里找到目标关键词&#xff0c;而创作者们的内容则可以吸引流量&#xff0c;助力各种项目。 别被那些所谓的爆粉秘籍迷惑了&#xff0c;真正的成功往往来自于扎实的内容和策略&#xff0c;而非…

云原生(七)、Kubernetes初学 + 裸机搭建k8s集群

Kubernetes简介 Kubernetes&#xff08;通常简称为K8s&#xff09;是一个开源的容器编排平台&#xff0c;最初由Google设计和开发&#xff0c;现在由Cloud Native Computing Foundation&#xff08;CNCF&#xff09;维护。它旨在简化容器化应用程序的部署、扩展和管理。 Kube…

IPC 进程间通信

IPC InterProcess Communication The concept of IPC Each process has a differnt user addess space,and local variables 各自看不见,so 进程间通信 need kernel(内核), so a buffer is opened in the kernel,process 1 copies data from user space to this buffer,and …

Linux:运营商在网络中扮演的角色

文章目录 ip目前的问题ip目前的几种解决方案私有ipVS公有ip运营商再谈ip划分运营商的角度看ip 本篇总结的是运营商在网络中扮演的角色 ip目前的问题 在目前看来&#xff0c;ip最大的问题是ip号不够用了&#xff0c;那这个问题如何解决呢&#xff1f; 在之前的内容中有子网掩…

朗之万方程,机器学习与液体中的粒子运动

目录 一、说明二、朗之万方程的诞生2.1 牛顿力学2.2 流体中的随机运动 三、小质量物体布朗运动方程四、布朗运动的Python代码五、稳定性讨论5.1 波尔兹曼分布5.2 梯度下降算法 六、随机梯度下降&#xff08;SGD&#xff09;和小批量梯度下降七、机器学习与物理&#xff0c;作为…

加密软件VMProtect教程:使用脚本-功能

VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic&#xff08;本机&#xff09;、Virtual Pascal和XCode编译器。 同时&#xff0c;VMProtect有一个内置的反汇编程序&#xff0c;可以与Windows和Mac OS X可执行文件一起…

最大连续1的个数||

又用到滑动窗口&#xff0c;关键在于要维持窗口内0的数量在k内 #include<stdio.h> #include<string.h>int Max(int a,int b){return (a>b)?a:b; }int findMaxConsecutiveOnes(int* nums,int numsSize,int k){int left 0;int right 0;int flag 0;//记录包含…

系统设计理念:满足设计要求

在今天的文章中,我们将层层剥离并深入探讨系统设计要求的本质。 让我们了解系统设计的支柱以及如何创建强大且有弹性的应用程序。 什么是好的设计? 在我们深入讨论技术细节之前,让我们先讨论一下什么是好的设计。 当我们谈论系统架构中的良好设计时,我们关注几个关键原则:…

初始C语言最后一章《编译、链接与预处理详解》

前言 感谢老铁们的陪伴和支持&#xff0c;初始C语言专栏在本章内容也是要结束了&#xff0c;这创作一路下来也是很不容易&#xff0c;如果大家对 Java 后端开发感兴趣&#xff0c;欢迎各位老铁来我的Java专栏&#xff01;当然了&#xff0c;我也会更新几章C语言实现简单的数据结…

C++中的面向对象到底是什么

C中的面向对象到底是什么 对象嘛&#xff0c;就和大家都有的对象一样&#xff0c;两只眼睛、一个嘴巴、两条腿…… 对不起跑题了&#xff0c;C的面向对象中的对象可不是显示中的对象哦&#xff0c;但是有一些相似之处&#xff0c;有对象的同学可以参考着去学习C面向对象的概念…

HackTheBox-Machines--Builder

文章目录 1 端口扫描2 测试思路3 漏洞测试 Builder测试过程 1 端口扫描 nmap -sC -sV 10.129.230.2202 测试思路 系统开启了22和8080端口&#xff0c;22端口无账号密码&#xff0c;测试方向主要从8080的jenkins服务开始测试。 在测试开源系统时&#xff0c;可以下载源代码或本地…

3、jvm基础知识(三)

如何判断堆上的对象没有被引用&#xff1f; 常见的有两种判断方法&#xff1a;引用计数法和可达性分析法。 引用计数法会为每个对象维护一个引用计数器&#xff0c;当对象被引用时加1&#xff0c;取消引用时减1。 引用计数法的优点是实现简单&#xff0c;缺点有两点&#xff1…

电机选型与直线模组(简化版)

2-1电机分类和普通电机选型 1、电机及其原理的基本认知&#xff1a; 电动机我们平时简称电机&#xff0c;大部分情况下指的都是通电后&#xff0c;输出轴会旋转运动的设备。即将电能转换为机械能&#xff0c;供我们使用以驱动机构运行。电机简单的讲&#xff0c;其实就是一个…