变量不是类的静态成员

时间:2011-08-11 19:15:34

标签: objective-c ios objective-c++

我正在开发一个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 个答案:

答案 0 :(得分:5)

这是一个gcc错误。有关其中的一个报告,请参阅Objective-C++ block vs Objective-C block

&lt; soapbox&gt;我建议尽可能避免使用Objective-C ++。编译速度慢,运行起来很臃肿(尤其是ARC,因为它打开了-fobjc-arc-exceptions),编译器和调试器中的错误,以及我给两个世界中最糟糕的经历带来的麻烦。 C ++很好。 Objective-C很好。只需保持它们之间的接口尽可能小。 &LT; /肥皂盒&GT;

但切换到clang 2.0可能会解决这个具体问题。

答案 1 :(得分:1)

如果它可以帮助别人......

我的项目需要使用10.6 SDK和LLVM-gcc 4.2。我不能要求clang代码编译。

我通过在父函数中将我的变量声明为shared_ptr来解决这个问题...将我需要的实际对象放在堆上。在块中,我通过shared_ptr变量访问对象。这种安排使得shared_ptr被隐式地复制到块中,而父函数中的副本可以自由释放。由于我没有在块中声明变量,因此我绕过了该错误。

如果代码是在clang或其他编译器上构建的,我使用预处理器检查来使用普通的堆栈变量。