Я использую GCD для ускорения некоторых вычислений в нескольких шаблонах C ++, над которыми я работаю. Я уже сделал это успешно для нескольких функций, но теперь я пытаюсь заставить его работать для функции-члена, и я столкнулся с этой странной проблемой с областью видимости. Код выглядит примерно так:
inline void op::factorOutGaussian(const double *x, const complex *y)
{
op a = *this;
NSInteger modes = op::modes;
NSInteger modes2 = modes*modes;
NSInteger *m = op::m;
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
void (^block)(size_t) = ^(size_t i) {
NSInteger mi = m[i];
if (mi == 0) {
for (NSInteger j = 0; j < modes; j++) {
this->_a1[i] += a._b1[i*modes+j] * x[j];
for (NSInteger k = 0; k < modes; k++) {
this->_a1[i] += a._c1p[i*modes2+j*modes+k] * x[j] * x[k]
+ a._c1m[i*modes2+j*modes+k] * y[j*modes+k];
}
}
}
//A bunch more loops like the one above follow. You get the idea.
};
dispatch_apply(modes, globalQueue, block);
this->symmetrize();
}
Я понимаю, что при доступе к таким элементам массива, как, например, a._c1m [i mode2 + j mode + k], могут возникнуть некоторые проблемы с областью видимости (т. Е., Возможно, мне понадобится несколько указателей или что-то в этом роде), но вот реальная проблема: когда я объявляю NSIntegers, например, mi или просто циклические индексы j и k, например, компилятор выдает мне массу ошибок, таких как:
NSInteger op :: mi не является статическим членом класса op
Это произошло только со мной для этой функции-члена - я применил почти ту же технику к функции-другу (с теми же объявлениями NSInteger в области видимости блока), и она работала просто отлично.
Единственное исправление, которое я смог придумать, - это объявить все мои циклические переменные вне блока как указатели, а затем разыменовать их в области видимости блока, но это выглядит как хак. Кто-нибудь знает, что здесь происходит?
Заранее спасибо за помощь!