Objective-C ++中的GCD /块作用域

时间:2010-06-21 14:46:31

标签: scope block objective-c++ grand-central-dispatch

我正在使用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 modes2 + j 模式+ k]等数组元素时,可能存在一些范围问题(即我可能需要抛出一些)指针在那里或其他东西),但这是真正的问题:例如,当我声明像mi的NSIntegers或只是循环索引j和k时,编译器给了我大量的错误,如下所示:

  

'NSInteger op :: mi'不是'class op'的静态成员

这只发生在我的成员函数中 - 我在友元函数上实现了几乎完全相同的技术(在块的范围内具有相同的NSInteger声明)并且它工作得很好。

我能够想到的唯一解决方法是将块外的所有循环变量声明为指针,然后在块的范围内取消引用它们,但这让我感觉像是一种黑客攻击。有谁知道这里发生了什么?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

这似乎是Apples gcc中的编译器错误。您无法在C ++成员函数中使用自己的变量创建块文字,即使它们是静态的。因此,现在您必须将此代码移至friend函数并将错误报告给Apple。