以下代码是我作为较大项目的一部分编写的插值函数的一部分。 此函数的第一个版本返回了 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_studyirasshell_2011-05-13iras_srctemplateutilityfunctions.h(74):
error C2109: subscript requires array or pointer type
1> j:london_studyirasshell_2011-05-13iras_srchydpowclass.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> ]
根据您的评论,在您的实际代码中,仅传递了yarray
double
,而不是double*
或std::vector<double>
。这是一个具有足够小但不正确的重现的简单情况 - 真正的错误在于您的真实代码。
在您发布的代码中,您正在使用 myYVec = double*
调用finterp
。 这可以通过[0]
很好地索引。
当您在更大的项目中使用它时,您如何调用finterp
? Visual Studio应该在c2109之后的错误消息中告诉您。
作为第三个参数传入的任何类型显然都是不可索引的。
编辑 啊,您已经用错误消息更新了您的问题。 当您使用 myYVec = double
调用 finterp
时会发生此错误 - 这是不可索引的。 我想你的意思是使用double*
.