我正在开发一个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'
答案 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或其他编译器上构建的,我使用预处理器检查来使用普通的堆栈变量。