Блок Objective-C ++ против блока Objective-C - PullRequest
4 голосов
/ 29 июня 2011

В Objective-C у меня есть действительный код:

TestTwo.h:

@interface TestTwo : NSObject
-(void)test;
@end

TestTwo.m:

@implementation TestTwo
-(void)test
{
    void (^d_block)(void) = 
    ^{
        int n;
    };
}
@end

Что я действительно хочу, так этокласс Objective C ++, который определяет метод, подобный test.Это упрощение, но иллюстрирует намерение.Итак, в Objective-C ++ у меня есть:

Test.h:

class Test
{
public:
    void TestIt();
};

Test.mm:

#include "Test.h"

void Test::TestIt()
{
    void (^d_block)(void) = 
    ^{
        int n;
    };
}

Я получаю следующую ошибку:

ошибка: int Test :: n не является статическим членом класса Test.

Если я удалю int n;, ошибки не будет.Как мне определить n внутри блока в этом контексте?

Ответы [ 2 ]

6 голосов
/ 30 июня 2011

Это ошибка GCC, поданная под радаром # 8953986 . Вы можете либо использовать Clang / LLVM 2.0+, чтобы скомпилировать код как есть, либо поместить переменные блока в глобальное пространство имен (т.е. int ::n) и использовать GCC. Обратите внимание, что использование глобального пространства имен в этом случае недопустимо в C ++, и Clang / LLVM 2.0+ не будет его компилировать.

0 голосов
/ 29 июня 2011

В определении класса вы можете добавить:

private:
static int n;
...