GCD/область видимости блока в Objective-C++

Я использую 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[imodes2+jmodes+k] (т.е. мне может понадобиться добавить туда несколько указателей или что-то в этом роде), но вот настоящая проблема: когда я объявляю NSIntegers, такие как mi или, например, просто циклические индексы j и k, компилятор выдает мне массу ошибок, таких как следующие:

«NSInteger op::mi» не является статическим членом «класса op»

Это случилось только со мной для этой функции-члена — я применил почти точно такой же метод для функции друга (с теми же объявлениями NSInteger в области блока), и это сработало просто отлично.

Единственное исправление, которое я смог придумать, — это объявить все мои циклические переменные вне блока как указатели, а затем разыменовать их в области блока, но это кажется мне своего рода хаком. Кто-нибудь знает, что здесь происходит?

Заранее спасибо за вашу помощь!


person tiadecol    schedule 21.06.2010    source источник
comment
Это не C++ (или какой-то нестандартный вариант C++). Кареты отдают это.   -  person James McNellis    schedule 21.06.2010
comment
Использование NSInteger предполагает, что это не C++, а скорее Objective-C++, и синтаксис ^ (очевидно, замыкание?) также недопустим для C++.   -  person Konrad Rudolph    schedule 21.06.2010
comment
Да, я использую Grand Central Dispatch (GCD), расширение языка C от Apple. В нем вы определяете блоки так же, как и указатели на функции, но с помощью ^s вместо *s. И да, я думаю, код, который я разместил, технически написан на Objective-C++.   -  person tiadecol    schedule 21.06.2010


Ответы (1)


Кажется, это ошибка компилятора в Apple gcc. Вы не можете создавать блочные литералы с их собственными переменными внутри функций-членов C++, даже если они являются статическими. Так что пока вы должны переместить этот код в функцию friend и сообщить об ошибке в Apple.

person Sven    schedule 09.09.2010