0

私はすでにこの質問を調査しようとしましたが、コードにクラスが含まれていないのに対し、エラーを扱うすべての質問はクラスとそのデフォルトのコンストラクターに関係しているようです。指定された配列の要素数を返す単純な 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]

与えられます。何が起こっている?

4

1 に答える 1

2

コンパイラは、見た目からNULLと比較されることについて警告しています。int厳密にはエラーではありませんが (エラーになったわけでもありません)、誤った仮定が行われていることを示している可能性があります。そのような仮定の 1 つは、配列が魔法のように null で終了するということのようです。そうではありません。これは文字列リテラルに非常に固有のものであり、それでもヌルターミネータは notNULLではなく'\0'. 配列のサイズを渡すか、テンプレートを使用して推測する必要があります。

template <typename T, int Size>
int sise(T (&array)[Size], int count) {
    ...
}
于 2013-11-03T20:06:40.697 に答える