3

次のコードは、より大きなプロジェクトの一部として私が書いた補間関数の一部です。この関数の最初のバージョンは myScalar yval を返しましたが、関数が機能したかどうかのフラグを返すように変更しました。

私の質問はこれです。次のコードは、codepad.org と小規模な Visual Studio プロジェクトの両方で単独で実行するとコンパイルされます。しかし、私の大規模なプロジェクトでは、エラー C2109 "添え字には配列またはポインター型が必要です" が表示されます。何がうまくいかないのですか?

前もって感謝します!-- ジョー

using namespace std;

template <class myScalar, class myXVec, class myYVec>
int finterp(int mode, myXVec xarray, myYVec yarray, int num_pts, myScalar xval, myScalar &yval)
{
   myScalar dx, dydx, xmin, xmax;
   int success_flag = 0;

   if (num_pts < 1) return success_flag;
   yval = yarray[0]; //Visual Studio error C2109

   //some more calculations are here

   success_flag = 1;
   return success_flag;
}

int main()
{
   double *xvec, *yvec;
   xvec = new double [5]; yvec = new double [5];
   for (int i = 0; i < 5; i++)
   {
      xvec[i] = (double)i;
      yvec[i] = (double)i+1;
   }
   double x, y;
   x = 3.0;
   int success = finterp(1, xvec, yvec, 5, x, y);
   cout << y << "  " << success << endl;
   return 0;
}

出力:

1> j:\london_study\irasshell_2011-05-13\iras_src\templateutilityfunctions.h(74): 
   error C2109: subscript requires array or pointer type 
1> j:\london_study\irasshell_2011-05-13\iras_src\hydpowclass.cpp(41) : 
   see reference to function template instantiation 'int finterp<double,std::vector<_Ty>,double>(int,myXVec,myYVec,int,myScalar,myScalar &)' being compiled 
1> with 
1> [ 
1> _Ty=double, 
1> myXVec=std::vector<double>,
1> myYVec=double, 
1> myScalar=double 
1> ] 
4

2 に答える 2

2

あなたのコメントによると、実際のコードでは、 orではなくdoublefor が渡されています。これは、十分に小さいが正しくない再現コードを持つ単純なケースです。実際のエラーは実際のコードにあります。yarraydouble*std::vector<double>

于 2011-05-20T15:17:54.243 に答える
1

投稿したコードでは、で呼び出しfinterpていmyYVec = double*ます。これは で問題なく索引付けできます[0]

これをより大きなプロジェクトで使用する場合、どのように呼び出しfinterpますか? Visual Studio は、c2109 の後のエラー メッセージで通知する必要があります。

3 番目のパラメーターとして渡す型は、明らかにインデックス付けできません。

EDIT ああ、エラーメッセージで質問を更新しました。finterp-- で呼び出すとエラーが発生しますが、myYVec = doubleこれはインデックス可能ではありません。を使用するつもりだったと思いますdouble*

于 2011-05-20T15:20:07.703 に答える