尝试学习如何使用模板
Trying to learn how to use template
#include <iostream>
#define M 6
#define N 5
template <class T>
T *merge(T *a, T *b) {
T *c = new int[N+M];
for (int i=0, j=0, k=0; k<N+M; k++)
if (j>=M || (i<N && a[i] < b[j])) c[k] = a[i++];
else c[k] = b[j++];
return c;
}
int main() {
int a[N] = {3, 2, 5, 11, 7};
char b[M] = {'i', 's', 'b', 'y', 'o', 'p'};
int *c = merge(a, b);
for (int i=0; i<N+M; i++)
std::cout << c[i] << std::endl;
}
当我编译代码时,它给了我"sort.cpp:18:错误:没有匹配函数来调用"merge(int [5],char [6]("。有人可以解释我做错了什么吗?谢谢。
有人可以解释我做错了什么吗?
好吧,我不会说你不应该合并整数列表和字符列表,因为如果你真的想要,你可以这样做(也许是为了学习目的?
因此@R Sahu 的答案是正确的,因为您正在混合非隐式可转换的类型。不过,这可能不是你想要的答案。您想知道为什么这个模板对这个用法是错误的,而不是为什么这个模板的错误使用。
你做错了什么(假设你想混合类型(是只用一个typename
声明你的模板,因此强制两个参数是相同的类型:
template <class T> T *merge(T *a, T *b)
你看,a
和 b
都是 T
类型的指针,这是不可能的,因为 char*
和 int*
不兼容。您需要两个类型名称来适应您的使用:
template <class T, class U> T *merge(T *a, U *b)
这正是编译错误消息告诉您的:您有两种类型,但没有模板可以与之匹配。
当你调用merge(a,b)
时,编译器试图在给定参数a
和b
的情况下推导出类型T
。 a
衰变为int*
,b
衰变为char*
. b
必须转换为int*
才能使类型扣除导致T = int
,或者a
必须转换为char*
才能使扣除导致T = char
。由于这些都不是有效的转换,因此编译器无法推断T
。
您可以通过将b
设置为int
数组或a
char
数组来解决此问题。
相关文章:
- 我可以在没有C++的情况下学习 Win32 API(仅使用 C)吗?
- 我正在学习C++,我不能使用指针访问参考吗?(举个例子)
- 试图学习指针,为什么要使用它们而不是仅仅使用&?
- 在机器学习中使用责任链模式
- 对于初学者来说,我应该学习" c or c++ "之间的哪一个才能使用Arduino UNO?
- 学习C :错误:使用已删除功能
- 当我们在C 中已经可以使用STL排序功能时,为什么我们需要学习不同的排序算法
- 使用类、私有、公共、构造函数、函数、整数和字符串对进一步学习进行编程
- 学习如何在遇到错误'variable not declared in scope'的 c++ 中使用指针
- 使用OpenCV作为机器学习自由而不是TensorFlow
- 我正在尝试学习使用 SDL 制作游戏。我的书教SDL1.2.3,我无法让它在Visual Studio上工作。谁能帮忙?我的错误:
- 学习 c++11 智能指针,它不会让我像指针一样使用隐式转换吗?
- 学习使用Boost共享指针,控制台输出正确吗
- 我正在使用Xcode进行c ++编程和学习。为什么我不能在一个项目中放置许多具有 MAIN 功能的单独源文件?
- 将OpenGL与Visual Studio 2013学习版结合使用
- 使用 LLVM 的 libc++ 时,__1 符号从何而来?
- 使用Visual C++2013学习版调试64位程序
- 使用Microsoft Visual C++2010学习版的C++多个文件
- 在std::cout之后使用std::cin时,换行符从何而来
- 使用 C/C++学习 COM 会帮助我更好地理解 .NET 吗?