Переменная не является статическим членом класса - PullRequest
2 голосов
/ 11 августа 2011

Я работаю над классом GameKitHelper, и он в основном написан на C ++, но в некоторых местах также и с Objective-C, внутри файла .mm.

Я удалил немного функциональности, чтобы изолировать ошибку:

void GameKitHelper::PopulateFriendScores(DynArray<GameCenterScore> *FriendScores)
{
    GKLeaderboard *leaderboardRequest = [[GKLeaderboard alloc] init];
    if (leaderboardRequest != nil)
    {
        leaderboardRequest.playerScope = GKLeaderboardPlayerScopeFriendsOnly;
        leaderboardRequest.timeScope = GKLeaderboardTimeScopeAllTime;
        leaderboardRequest.range = NSMakeRange(1,25);

        [leaderboardRequest loadScoresWithCompletionHandler: ^(NSArray *scores, NSError *error) 
         {
             int i = 0;
             printf("%d", i);
         }];
    }
}

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

'int GameKitHelper::i' is not a static member of 'class GameKitHelper'

Ответы [ 2 ]

5 голосов
/ 12 августа 2011

Это ошибка gcc.См. Блок Objective-C ++ против блока Objective-C для одного из многих отчетов об этом.

Я рекомендую избегать Objective-C ++ в максимально возможной степени.Он медленно компилируется, раздувается и запускается (особенно с ARC, так как он включает -fobjc-arc-exceptions ), с ошибками в компиляторе и отладчике, и, по большей части, в моем опыте беспорядок, дающий худшеемиры.С ++ в порядке.Objective-C в порядке.Просто держите интерфейс между ними как можно меньше.

Но переход на clang 2.0 может решить эту конкретную проблему.

1 голос
/ 21 марта 2013

В случае, если это может помочь кому-то еще ...

Потребности моего проекта требуют использования SDK 10.6 и LLVM-gcc 4.2. Я не могу требовать clang для кода для компиляции.

Я обошел эту проблему, объявив свою переменную shared_ptr в родительской функции ... поместив нужный объект в кучу. В блоке я получаю доступ к объекту через переменную shared_ptr. Такое расположение приводит к тому, что shared_ptr неявно копируется в блок, в то время как копия в родительской функции может быть освобождена. Поскольку я не объявляю переменную в блоке, я обхожу ошибку.

Я использовал проверку препроцессора, чтобы использовать обычную переменную стека, если код строится на clang или каком-либо другом компиляторе.

...