首页 > 编程语言 >c++ 调用函数,编译器查找函数过程

c++ 调用函数,编译器查找函数过程

时间:2023-05-01 20:12:46浏览次数:40  
标签:函数 int c++ 编译器 调用函数 func Test 模板

假设此处调用函数 

int a=1;
float b=1.0;
func(a, b);    //调用函数

若func为非模板函数,编译器查找所有的名称为func的函数,然后检查函数入参的数量,再然后检查每个入参是否都可以转换到目标类型。(此处注意,如果参数类型为类对象,若该类支持隐式转换,那么会出现如下情况:

class Test{
    int x;
    Test(int n):x(n){}
}

void func(Test &t,float k);
//...
func(1,1.0);    //合法,1被隐式转换为了Test(1)临时变量

)

如果检索到唯一的函数,则调用该方法;如果有多个函数符合,编译器会挑选出最佳重载的方法进行调用,如果挑选不出,编译器就会报错(歧义错误 ambigouous error)。

 


 

若func为模板函数,编译器将会查找名称与入参类型都要完全匹配的模板方法。看下面这个例子:

class Test{
public: int x; Test(int n):x(n){} } template<typename T> void func(T &a,T &b); //... func(1,1.0); //非法
Test t(1);
func(1,t);    //非法
 

此时第一次调用func入参为1,1.0,类型为int和double,没有匹配的模板。

第二次调用func入参为1,1.0,类型为int和Test,没有匹配的模板。

也就是说,编译器寻找匹配的模板函数时,不会去考虑隐式转换而是先考虑参数类型。

标签:函数,int,c++,编译器,调用函数,func,Test,模板
From: https://www.cnblogs.com/Explosion556/p/17366914.html

相关文章

  • c++回调函数
    回调函数本质上也是普通函数,只是调用机制有所区别——首先通过传参的形式将该函数的地址传递给其他函数,然后在其他函数中通过函数指针调用该函数。在其他函数中通过函数指针调用该函数的过程称为回调,而作为被调用的该函数则被称为回调函数。为什么需要回调函数?满足接口兼容性回......
  • PB反编译器(PBKiller) 2.5.18 特别版
    PBKiller是一款非常优秀的PB反编译器,它可以反编译PB6.7.8.9编译出来的所有对象和源码。用PBkiller软件打开相应的PBD文件,显示如下,可以只导出需要的函数、窗口等,也可以全部导出。截图:http://www.mis2erp.com/soft/PBDE03.pnghttp://www.mis2erp.com/soft/PBDE04.pnghttp://www.mis2e......
  • 10分钟搞定!C++类中构造函数和析构函数的完全指南
    一、初步认识构造函数1.什么是构造函数?要了解构造函数就要先了解一下,类的6个默认成员函数,如下图:构造函数:构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次。通俗一点来......
  • 【c++】libtorch和qt和opencv部署
    https://blog.csdn.net/rglkt/article/details/125508634opencv和libtorch的兼容问题,只需要下载(cxx11ABI)即可关于slot报错问题:引入torch文件时使用这种办法#undefslots#include<torch/torch.h>#include<torch/script.h>#defineslotsQ_SLOTS命名空间的问题参......
  • 用C/C++在Linux和Android NDK中获取设备的IP地址
    C/C++开发的获取设备IP地址的代码,下面链接中的版本是在Linuxx86-64环境中编译(Centos7.5)的,也可在其它版本的Linux中或者AndroidNDK('armeabi-v7a','arm64-v8a','x86','x86_64'等版本)中编译。下载地址(此版本须在Linuxx86-64环境中运行):金山文档https://kdocs.cn/l/cd4VM3e......
  • C/C++《程序设计基础II》[2023-04-30]
    C/C++《程序设计基础II》[2023-04-30]2022级计算机专业《程序设计基础II》小组项目作业作业要求:1.分小组完成,2-4人一组(每个题目后面有人数要求,见附件1);2.任课老师按小组分配任务;3.作业时长为1周;4.提交内容为:WORD文档,内容包括:题目内容、算法分析、代码实现(要求加注释)、运行结......
  • C++11完美转发及实现方法详解
    C++11标准为C++引入右值引用语法的同时,还解决了一个C++98/03标准长期存在的短板,即使用简单的方式即可在函数模板中实现参数的完美转发。那么,什么是完美转发?它为什么是C++98/03标准存在的一个短板?C++11标准又是如何为C++弥补这一短板的?别急,本节将就这些问题给读者做一一......
  • c++11:std::forward,完美转发
    目录1、不完美转发2、完美转发2.1、引用折叠2.2、std::forward1、不完美转发所谓完美转发,是指在函数模板中,完全按照模板的参数的类型,将参数传递给函数模板中调用的另一个函数。比如:template<typenameT>voidIamForwording(Tt){IrunCodeActually(t);}上面的例子中,IamF......
  • C++ 基础语法
    C++基础语法基本输入输出#include<iostream>usingnamespacestd;intmain(){cout<<"xtloveac"<<endl;return0;}头文件#include<cstdio>包含printf(输出),scanf(输入)#include<iostream>包含cin(读入),cout(输出)usi......
  • C/C++ 各类型int、long、double、char、long long取值范围(基本类型的最大最小值)
    做题的时候经常会使用到数据类型的最大最小值(如int,long,longlong,char等),我也查了很多次,这次就记下来当笔记吧。参考了C++primeplus、各个博客、教程和c++官网,对C/C++中各个类型int、long、double、char、longlong等基本类型的取值范围即最大最小值总结如下:1字节=8位,......