C++ 尝试学习如何使用模板 #包括 #定义m6 #定义n5 模板 T*merge(T*a,T*b){ T*c=新整数[N+M]; 对于(inti=0,j=0,k=0;k=M | | |)(当调用merge(a,b)时,i
),编译器尝试推断类型C++ 尝试学习如何使用模板 #包括 #定义m6 #定义n5 模板 T*merge(T*a,T*b){ T*c=新整数[N+M]; 对于(inti=0,j=0,k=0;k=M | | |)(当调用merge(a,b)时,i,c++,C++,),编译器尝试推断类型T,给定参数a和ba衰减为int*,b衰减为char*b必须转换为int*,才能进行类型推断,从而产生T=int或a转换为char*,以使推断结果为T=char。由于这两种转换都无效,编译器无法推断T 您可以通过使b成为ints的数组或使a成为chars的数组来解决此问题 有人能解释我做错了什么吗 好吧,我不会说你不应该合并一个整数列表和一个字符列表,因为如果你真的想要的话,你可以这样做(也许是为了学习?) 因此@R Sahu answer是正确的,因为您混合了不可隐式转换
T
,给定参数a
和b
a
衰减为int*
,b
衰减为char*
b
必须转换为int*
,才能进行类型推断,从而产生T=int
或a
转换为char*
,以使推断结果为T=char
。由于这两种转换都无效,编译器无法推断T
您可以通过使b
成为int
s的数组或使a
成为char
s的数组来解决此问题
有人能解释我做错了什么吗
好吧,我不会说你不应该合并一个整数列表和一个字符列表,因为如果你真的想要的话,你可以这样做(也许是为了学习?)
因此@R Sahu answer是正确的,因为您混合了不可隐式转换的类型。尽管如此,这可能不是您想要的答案。您想知道的不是该模板的错误使用原因,而是该模板的错误使用原因
您所做的错误(假设您想要混合类型)是将模板声明为只有一个typename
,因此强制两个参数为同一类型:
模板T*合并(T*a,T*b)
您可以看到,a
和b
都是T
类型的指针,这是不可能的,因为char*
和int*
不兼容。您需要两个类型名来适应您的使用:
模板T*合并(T*a,U*b)
这正是编译错误消息告诉您的:您有两种类型,但没有模板可以与之匹配。使用常量而不是宏。
#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;
}