使用谓词模板函数从此处实例化错误

时间:2013-11-03 19:57:32

标签: c++ size

我已经尝试过研究这个问题,但似乎每个处理我的错误的问题都与类及其默认构造函数有关,而我的代码不包含任何类。它是一个简单的size()函数,它返回给定数组中的元素数。 (我知道有一个内置的size()函数,这不是重点)。

我起初认为当我的函数size()命名时,我已经存在一个size()函数,所以我把它改成了sise(),但我仍然接受了同样的错误并且不知道如何解决它

代码:

template<class T > int sise(T array[], int count){
  if(array[count+1]== NULL){
    return count+1;
  }
  else{
    return sise(array,count+1);
  }
}

template <class T> int sise(T array[]){
  return sise(array , 0);
  }

int main(){
  int array[] = {1 , 7 , 5, 4, 6 ,2 , 3};
  int len = sise<int>(array);
  std::cout << len << std::endl;
  //print<int>(array);
  //  shakersort<int>(array);
  // print<int>(array);

  return 0;
}

不要担心main()中注释掉的函数调用,因为每个相应的调用函数都已被注释掉但是同样的错误

Shakersort.cpp: In function ‘int sise(T*, int) [with T = int]’:
Shakersort.cpp:60:24:   instantiated from ‘int sise(T*) [with T = int]’
Shakersort.cpp:77:28:   instantiated from here
Shakersort.cpp:51:3: warning: NULL used in arithmetic [-Wpointer-arith]

给出。发生了什么事?

1 个答案:

答案 0 :(得分:2)

编译器警告NULLint的外观进行比较。不是严格意义上的错误(也不是错误),而是可能表明存在错误的假设。一个这样的假设似乎是数组神奇地以空值终止:它们不是。这是字符串文字非常具体的东西,即使这样,空终止符也不是NULL而是'\0'。您需要传递数组的大小,或者您需要使用模板推断它,例如:

template <typename T, int Size>
int sise(T (&array)[Size], int count) {
    ...
}