Переменная не является статическим членом класса


Я работаю над классом 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 2

2 ответа:

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

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

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

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

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

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

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