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;
}