模板函数“下标需要数组类型”,但适用于较小的项目。为什么?

时间:2011-05-20 15:08:12

标签: c++ templates compiler-errors subscript

以下代码是我作为大型项目的一部分编写的插值函数的一部分。这个函数的第一个版本返回了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 个答案:

答案 0 :(得分:2)

根据您的评论,在您的真实代码中仅传递了double yarray而不是double*std::vector<double>。这是一个简单的例子,它具有足够小但不正确的重复 - 真正的错误在于你的真实代码。

答案 1 :(得分:1)

在您发布的代码中,您使用finterp致电myYVec = double*。这可以使用[0]编制索引。

在较大的项目中使用它时,您如何调用finterp? Visual Studio应该在c2109之后的错误消息中告诉你。

您输入的是什么类型,因为第三个参数显然是不可索引的。

编辑啊,您已使用错误消息更新了问题。当您使用finterp调用myYVec = double时,会发生错误 - 这是不可索引的。我认为您打算使用double*