Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 查找项目功能模板给我带来的问题_C++_Templates_Pointers_Syntax Error_Function Templates - Fatal编程技术网

C++ 查找项目功能模板给我带来的问题

C++ 查找项目功能模板给我带来的问题,c++,templates,pointers,syntax-error,function-templates,C++,Templates,Pointers,Syntax Error,Function Templates,我试图在一个范围内找到一个项,因此我对名为“find”的模板函数进行了多个测试 模板T*find(T*left,T*end,T项); 这就是我正在使用的功能原型,它无法与我的第一个测试一起工作,即: static void TestFind1(void) { cout << "***** Find1 *****" << endl; const int i1[] = {-1, 2, 6, -1, 9, 5, 7, -1, -1, 8, -1}; int si

我试图在一个范围内找到一个项,因此我对名为“find”的模板函数进行了多个测试

模板T*find(T*left,T*end,T项);
这就是我正在使用的功能原型,它无法与我的第一个测试一起工作,即:

static void TestFind1(void)
{
  cout << "***** Find1 *****" << endl;
  const int i1[] = {-1, 2, 6, -1, 9, 5, 7, -1, -1, 8, -1};

  int size = sizeof(i1) / sizeof(int);
  const int *end = i1 + size;
  CS170::display(i1, end);
  const int item = 9;
  const int *pos = CS170::find(i1, end, item);
  if (pos != end)
    cout << "Item " << item << " is " << *pos << endl;
  else
    cout << "Item " << item << " was not found" << endl;
}
静态void TestFind1(void)
{

cout考虑到您正在尝试将
const int[]
const int*
作为参数传递给模板方法调用,并且模板实例化不考虑隐式转换,模板函数签名应为:

template <typename T> 
const T* find(const T *left, const T *end, const T& item);
模板
常数T*查找(常数T*左、常数T*结束、常数T&项);
e、 g:

模板
常量T*查找(常量T*左、常量T*结束、常量T&项){
while(左!=结束){
如果(项目==*左){
左转;
}
++左;
}
返回端;
}
或者,您可以将客户端代码更改为使用非常量
int[]
int*
参数,并且其中一个函数模板签名应该可以工作


但是,您不使用
std::find
有什么原因吗?

您正在传递一个类型为
const int[11]
的值作为
T*left
参数。在普通(非模板)函数中,这可以作为
const int[11]
可以隐式转换为
const int*
,但由于
find
是一个模板,因此不考虑隐式转换。隐式转换在重载解析期间考虑,但模板实例化发生在重载解析之前

您可以这样强制转换:

const int *pos = CS170::find(static_cast<const int*>(i1), end, item);
const int *pos = CS170::find(i1 + 0, end, item);

这是创建我们自己的向量库的任务。您的模板可以工作,但我在find下运行了多个测试用例,因此我不能在每个参数类型之前定义const。第二个测试使用除项以外的所有内容作为int。因此,请发布您的代码应该通过的所有测试,而不仅仅是一个测试。
template <typename T> 
const T* find(const T *left, const T *end, const T& item) {
  while (left != end) {
    if (item == *left) {
      return left;
    }
    ++left;
  }
  return end;
}
const int *pos = CS170::find(static_cast<const int*>(i1), end, item);
const int *pos = CS170::find(i1 + 0, end, item);