尝试学习如何使用模板

Trying to learn how to use template

本文关键字:何使用 学习      更新时间:2023-10-16
#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)

你看,ab 都是 T 类型的指针,这是不可能的,因为 char*int* 不兼容。您需要两个类型名称来适应您的使用:

template <class T, class U> T *merge(T *a, U *b)

这正是编译错误消息告诉您的:您有两种类型,但没有模板可以与之匹配。

当你调用merge(a,b)时,编译器试图在给定参数ab的情况下推导出类型Ta衰变为int*b衰变为char*. b必须转换为int*才能使类型扣除导致T = int,或者a必须转换为char*才能使扣除导致T = char。由于这些都不是有效的转换,因此编译器无法推断T

您可以通过将b设置为int数组或a char数组来解决此问题。

相关文章: