Функция шаблона «Subscript требует тип массива», но работает в небольших проектах. Зачем? - PullRequest
3 голосов
/ 20 мая 2011

Следующий код является частью функции интерполяции, которую я написал как часть более крупного проекта. Первая версия этой функции возвращала 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> ] 

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

Согласно вашему комментарию, в вашем реальном коде передается просто double для yarray, а не double* или std::vector<double>.Это простой случай с достаточно маленьким, но неправильным воспроизведением - настоящая ошибка заключается в вашем реальном коде.

1 голос
/ 20 мая 2011

В коде, который вы разместили, вы звоните finterp с myYVec = double*. Это может быть просто проиндексировано с помощью [0].

Когда вы используете это в большом проекте, как вы называете finterp? Visual Studio должен сообщать вам об ошибках после c2109.

Какой бы тип вы ни указали в качестве третьего параметра, он, по-видимому, не индексируется.

РЕДАКТИРОВАТЬ Ах, вы обновили свой вопрос с сообщением об ошибке. Ошибка возникает при вызове finterp с myYVec = double - который НЕ индексируется. Я думаю, что вы хотели использовать double*.

...