我编写了一个小代码,隔离了我在使用宏访问std :: vector元素中的值或为其赋值时所犯的错误方法/理解。下面是代码段。
#define mat(i,j,nrows) mat[((j)*(nrows))+(i)]
struct _STR1
{
int nRows, nCols;
std::vector < double >mat;
std::vector < double >anothermat;
};
void Create_Data (int &nC, _STR1 * &_str)
{
_str = new _STR1[nC];
for (int myid = 0; myid < nC; myid++)
{
_str[myid].nRows = 100;
_str[myid].nCols = 3;
_str[myid].mat.resize (_str[myid].nRows * _str[myid].nCols);
_str[myid].anothermat.resize (_str[myid].nRows * _str[myid].nCols);
for (int i_row = 0; i_row < _str[myid].nRows; i_row++)
{
_str[myid].mat (i_row, 0, _str[myid].nRows) = 1.0e0;
_str[myid].mat (i_row, 1, _str[myid].nRows) = 1.0e0;
_str[myid].mat (i_row, 2, _str[myid].nRows) = 1.0e0;
_str[myid].anothermat (i_row, 2, _str[myid].nRows) = 1.0e0;
}
}
}
如果我评论“ _str [myid] .anothermat(i_row,2,_str [myid] .nRows)= 1.0e0;”,则不会出现任何错误。否则会出现以下错误
error: call of an object of a class type without appropriate operator() or conversion functions to pointer-to-function type
我认为我对使用宏的理解是错误的,但我无法理解为什么是这样。
任何人都可以告诉我为什么这种方法是错误的,为什么我在一种情况下有错误,而另一种情况没有。我对宏的用法正确吗?
答案 0 :(得分:0)
尽管您的方法是非常规的,但在第一个矩阵的情况下,从技术上来说并不是错误的。在第二个矩阵的情况下,您根本没有为其编写宏,因此anothermat (i_row, 2, _str[myid].nRows)
不会转换为任何东西,并且由于它本身不是有效的C ++,因此无法构建您的程序。 / p>
schorsch312的答案显示了一种更好的方法(尽管有错别字);碰巧,我昨天才写了something similar。