C++中的模板仅在长数据类型上出错

Template in C++ Error only on long Datatype

本文关键字:数据类型 出错 C++      更新时间:2023-10-16

我是C++的新手,有人能帮我解决这个错误吗?

#include <iostream>
using namespace std;
template<typename T1>
int findElement(T1 field[],T1 element,long int indx);
template<typename T2>
double getAverage(T2 field[],long int indx);
int main()
{
       int arr1[] = {1,1,2,1,1,2,1,2,3};
  long int arr2[] = {19133,15133,13213};
    double arr3[] = {1,1,1,2.9,0,0,0,0};
  findElement(arr1,2,sizeof(arr1)/sizeof(int));
  cout << "Average =" << getAverage(arr1,sizeof(arr1)/sizeof(int)) << endl;
  findElement(arr2,15133,sizeof(arr2)/sizeof(long int)); //<=== Error
  cout << "Average =" << getAverage(arr2,sizeof(arr2)/sizeof(long int)) << endl;
  findElement(arr3,2.9,sizeof(arr3)/sizeof(double));
  cout << "Average ="  << getAverage(arr3,sizeof(arr3)/sizeof(double)) << endl;
  return 0;
}
template<typename T1>
int findElement(T1 field[],T1 element,long int indx)
{
      int pos = -1;
  cout << " searching for " << element << " ...";
  for(int i=0;i<indx;i++)
  {
      if(element==field[i])
      {
          pos = i;
      }
   }
   if(pos>0) cout << " found! Position is : " << pos << endl;
   else      cout << " no found!" << endl;
   return pos;
}
template<typename T2>
double getAverage(T2 field[],long int indx)
{
   int sum = 0;
   for(int i=0;i<indx;i++)
       sum += field[i];
   return static_cast<double>(sum)/static_cast<double>(indx);
}

|19 |错误:no>用于调用"findElement(long-int[3],int,long>>unsigned int)"的匹配函数|注意:候选者:>template-int-findElement(T1*,T1,long-int)|注意:模板参数推导/替换失败:|/home/robin/Dokumente/CPP/Labor2/Aufg2/aufg2b/main.CPP|19|注意:推断出参数"T1"("long-int"answers"int")的冲突类型|||===生成失败:1个错误,0个警告(0分钟,0秒)===|

问题是

template<typename T1>
int findElement(T1 field[],T1 element,long int indx);

要求fieldelement具有相同的类型。当你呼叫时

findElement(arr2,15133,sizeof(arr2)/sizeof(long int));

arr2long,但15133是类型为int的整数字面值。由于CCD_ 7和CCD_。请注意,编译器在模板参数推导过程中没有进行转换。如果在该步骤中类型不匹配,则不会使用该模板。

您可以通过将15133设置为类似的long整数文字来修复它

findElement(arr2,15133L,sizeof(arr2)/sizeof(long int));
                      ^ L for long