c++类型形参的实参的受限转换

简介:

缘起:《c++ primer》 4th, 528页,习题16.3

源程序

复制代码
#include <iostream>
#include <vector>
#include <list>
using namespace std;

template<class S>
int compare(const S &v1, const S &v2)
{
    if (v1 < v2)
        return -1;
    else if(v1 > v2)
        return 1;
    else
        return 0;
}

int main()
{
    string s1 = "hi";
    string s2 = "world"; 
    cout << "string:" << compare(s1, s2) << endl;
    cout << "hi:" << compare("hi", "world") << endl; }
复制代码

错误提示

函数模板中定义的类型S,在函数的两个参数中,类型必须相同,但是编译错误,提示:一个类型为char[3],另一个类型为char[6].这就引出一条实参的受限转换。

数组或函数到指针的转换:如果模板形参不是引用类型,则对数组或函数类型的实参应该用常规指针转换。数组实参将当做指向第一个元素的指针,函数实参当做指向函数类型的指针。

 

下边程序就可以了

复制代码
#include <iostream>
#include <vector>
using namespace std;

template<class S>
int compare(const S v1, const S v2)
{
    if (v1 < v2)
        return -1;
    else if(v1 > v2)
        return 1;
    else
        return 0;
}

int main()
{
    char a[] = "abcd";
    char b[] = "12345";
    cout << compare(a, b) << endl;
}
复制代码


注意直接传字串默认是const类型, 比如

复制代码
#include <iostream>
#include <vector>
using namespace std;

template<class S>
int compare(const S v1, const S v2)
{
    if (v1 < v2)
        return -1;
    else if(v1 > v2)
        return 1;
    else
        return 0;
}

int main()
{
    char a[] = "abcd";
    char b[] = "12345";
    cout << compare(a, "1234") << endl;
}
复制代码

错误提示:

改成正确的:

复制代码
#include <iostream>
#include <vector>
using namespace std;

template<class S>
int compare(const S v1, const S v2)
{
    if (v1 < v2)
        return -1;
    else if(v1 > v2)
        return 1;
    else
        return 0;
}

int main()
{
    const char a[] = "abcd";
    char b[] = "12345";
    cout << compare(a, "1234") << endl;
}
复制代码

 




本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3338496.html,如需转载请自行联系原作者

相关文章
|
1月前
|
C++
C++ 数学函数、头文件及布尔类型详解
C++ 支持数学操作,如`max`和`min`函数找最大值和最小值,以及`&lt;cmath&gt;`库中的`sqrt`、`round`等数学函数。`bool`类型用于布尔逻辑,取值`true`(1)或`false`(0)。布尔表达式结合比较运算符常用于条件判断,例如在`if`语句中检查年龄是否达到投票年龄。在代码示例中,`isCodingFun`和`isFishTasty`变量分别输出1和0。
122 1
|
2月前
|
算法 编译器 C++
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits 判断 Lambda表达式类型?
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits 判断 Lambda表达式类型?
43 4
|
2月前
|
算法 编译器 C语言
【C++ 迭代器的空类类型 】深入理解C++迭代器类别与空类标签的奥秘
【C++ 迭代器的空类类型 】深入理解C++迭代器类别与空类标签的奥秘
34 0
|
2月前
|
存储 安全 C++
C++ 用户输入与数据类型详解:建立基本计算器及变量类型
了解C++的用户输入和数据类型。使用`cin`从键盘读取数据,如在简单计算器示例中获取两个数字并求和。C++的数据类型包括:`int`(整数)、`float`(浮点数,约6-7位小数)、`double`(更精确的浮点数,约15位小数)、`bool`(布尔值,true或false)、`char`(单个字符)和`string`(文本字符串)。每种类型都有特定的存储大小和用途。在处理浮点数时,`double`通常更安全。字符串需要包含`&lt;string&gt;`库。更多内容可关注微信公众号`Let us Coding`获取。
40 0
|
2月前
|
存储 安全 算法
【C/C++ 数据发送结构设计】C++中的高效数据发送:多态、类型擦除与更多解决方案
【C/C++ 数据发送结构设计】C++中的高效数据发送:多态、类型擦除与更多解决方案
79 0
|
2月前
|
存储 算法 编译器
【C++ 函数尾部返回】C++中的尾返回类型:探究auto func() -> ReturnType的魔力
【C++ 函数尾部返回】C++中的尾返回类型:探究auto func() -> ReturnType的魔力
63 1
|
2月前
|
算法 编译器 数据库
【C++ 泛型编程 高级篇】使用SFINAE和if constexpr灵活处理类型进行条件编译
【C++ 泛型编程 高级篇】使用SFINAE和if constexpr灵活处理类型进行条件编译
248 0
|
2月前
|
设计模式 程序员 C++
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
261 2
|
2月前
|
安全 程序员 编译器
【C/C++ 泛型编程 进阶篇 Type traits 】C++类型特征探究:编译时类型判断的艺术
【C/C++ 泛型编程 进阶篇 Type traits 】C++类型特征探究:编译时类型判断的艺术
176 1
|
2月前
|
算法 程序员 C++
【C/C++ 泛型编程 应用篇】C++ 对多参数的参数包的 参数类型提取 应用
【C/C++ 泛型编程 应用篇】C++ 对多参数的参数包的 参数类型提取 应用
44 5