字符串作为函数模版实參的意外情况

有时,当把c风格的不同字符串去实例化函数模版的同一个模版參数时,在实參演绎的过程中常常会发生

意想不到的事情,那就是编译失败,并报错类型不匹配。

正如以下的样例一样:

#include<iostream>
using namespace std;

/*
*匹配測试
*/
template<typename T>
int ref_fun(T & t1,T & t2)
{
	return strlen(t1) - strlen(t2);
}

template<typename T>
int nonref_fun(T t1,T t2)
{
	return strlen(t1) - strlen(t2);
}

int main()
{
	//int a = ref_fun("abcd","abc");
	//Error:没有与參数列表匹配的模版实例
	//參数类型为(const char[5],const char[4])
	int b = nonref_fun("abcd","abc");
	//编译通过

}

对于上述这样的情况的解释就是:对于引用类型的字符串參数编译器会自己主动转换成“字符常量数组”比如const char[N],所以假设N值不同则两个字符串所相应的类型就不同,因此不能实例化同一个模版參数。而对于非引用

类型的字符串參数,编译器会自己主动将字符数组转换为字符指针类型,所以不同长度的字符串都会转换为同样额

字符指针类型,因此能够实例化同一个模版參数。

以下的代码是对于此结论的验证代码:

#include<iostream>
using namespace std;

/*
*类型測试
*/
template<typename T>
void Ref(T & t)
{
	cout<<t<<"ref:"<<typeid(t).name()<<endl;
}

template<typename T>
void nonRef(T t)
{
	cout<<t<<"ref:"<<typeid(t).name()<<endl;
}

int main()
{
	//输出引用字符串的类型
	Ref("abc");
	//输出非引用字符串的类型
	nonRef("abc");

	/*
	输出结果:
	abcref:char const [4]
        abcref:char const *
        请按随意键继续. . .
        */
}

字符串作为函数模版实參的意外情况

时间: 2024-10-04 08:38:42

字符串作为函数模版实參的意外情况的相关文章

字符串作为函数模版实参的意外情况

有时,当把c风格的不同字符串去实例化函数模版的同一个模版参数时,在实参演绎的过程中经常会发生 意想不到的事情,那就是编译失败,并报错类型不匹配. 正如下面的例子一样: #include<iostream> using namespace std; /* *匹配测试 */ template<typename T> int ref_fun(T & t1,T & t2) { return strlen(t1) - strlen(t2); } template<typ

函数声明和定义 函数调用 行参实參

1. 函数的定义 返回值类型  函数名(形式参数) { 语句 return 返回值: } 函数的返回值称为函数的值,只有通过return返回给主调函数 一个函数只能有一个返回值 函数没有返回值也可以通过return返回到主调函数 return后面的语句不再执行 2. 函数调用 3. 行参实參 行参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用 实參出现在主调函数中,进入被调函数后,实參变量也不能使用. 行参和实參的功能是做数据传送,发生函数调用时,主调函数把实參的值传送给被调函

Matlab 读取excel文件提示服务器出现意外情况或无法读取问题解决

1.问题描述: 该错误通常发生在应用函数读取excel文件(后缀xls或xlsx)时. 应用xlsread函数读取提示服务器出现意外情况: 应用importdata读取时提示can‘t open file: 其他格式如txt文档则可以正常读取. 2.问题解决 该问题与Matlab无关,为Excel端出现了问题.解决方案如下: 步骤:Excel选项——加载项——Com加载项 :去掉VisualStudion相关勾选. 去掉勾选的时候还可能出现“无法更改 中注册的office 加载项的连接状态”的提

STL算法设计理念 - 函数对象和函数对象当參数和返回值

函数对象: 重载函数调用操作符的类.其对象常称为函数对象(function object),即它们是行为类似函数的对象. 一个类对象,表现出一个函数的特征,就是通过"对象名+(參数列表)"的方式使用一个类对象,假设没有上下文,全然能够把它看作一个函数对待. 这是通过重载类的operator()来实现的. "在标准库中.函数对象被广泛地使用以获得弹性".标准库中的非常多算法都能够使用函数对象或者函数来作为自定的回调行为: demo #include <iostr

以前的笔记迁移__形參,实參,递归

形參变量仅仅有在被调用时,才分配内存单元.调用结束时.即刻释放所分配的内存单元. 实參和形參占用不同的内存单元,即使同名互不影响. 在被定义的函数中,必须指定形參的类型 实參与形參的类型应同样或赋值兼容. 良好的程序设计习惯:为了使程序具有良好的可读性并降低出错.凡不要求返回值的函数都应定义为空类型.即使函数类型为整型.也不使用系统的缺省处理. 一个函数在它的函数体内调用它自身称为递归调用. 这样的函数称为递归函数. C语言同意函数的递归调用.在递归调用中,主调函数又是被调函数. 间接递归 为了

面试题之java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况

题目:10. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”. 一.需要分析 1.输入为一个字符串和字节数,输出为按字节截取的字符串-------------->按照字节[byte]截取操作字符串,先将String转换成byte类型 .2.汉字不可以截半----------------------------------

PHP内置的字符串处理函数

字符串的特点    1.其他类型的数据用在字符串类型处理函数中,会自动将其转化成字符串后,在处理 <?php echo substr("abcdefghijklmn",2,4),"<br>"; //cdef //使用数字会自动转化为字符串 echo substr(123456,2,4); //3456 ?> 2.可以将字符串视为数组,当做字符集合来看待 <?php $str="abcdefg"; //下面这两种方法都

字符串处理函数总结

字符串函数(String processing function)也称为字符串处理函数,指的是编程语言中用来进行字符串处理的函数. C语言中常用的字符串函数: strcpy 原型:extern char *strcpy(char *dest,char *src); 用法:#include <string.h> 功能:把src所指由NUL结束的字符串复制到dest所指的数组中. 返回指向dest结尾处字符(NUL)的指针. 举例: // strcpy.c #include <syslib.

编写实现字符串拷贝函数strcpy()完整版

有个题目编程实现字符串拷贝函数strcpy(),很多人往往很快就写出下面这个代码. void strcpy( char *strDest,char *strSrc ) { while(( *strDest++ = * strSrc++) != '\0' );//逐个赋值字符串数组中的数据,知道字符串结束 } 其实仔细看看这个实现过程并不完美,严格来说非常不严谨,我们可以完善一下. char * strcpy( char *strDest, const char *strSrc )//将源字符串加