2013-02-27 124 views
4

我的工作目标,整合的git到我的项目,但是当我包括我的消息来源他们的头,我得到他们几个enum声明的这些错误:非整数基础类型,枚举

objective-git/Classes/GTRepository.h:57:16: Non-integral type 'git_reset_t' is an invalid underlying type

这里是有问题的代码:

typedef enum : git_reset_t { 
    GTRepositoryResetTypeSoft = GIT_RESET_SOFT, 
    GTRepositoryResetTypeMixed = GIT_RESET_MIXED, 
    GTRepositoryResetTypeHard = GIT_RESET_HARD 
} GTRepositoryResetType; 

我改变git_reset_tNSUInteger(typedef定义联合国签署长),并得到它编译,但当然,我宁愿不必更改库文件。

Objective-git在自己的项目中编译得很好,在该项目和我的项目之间的编译器设置中找不到任何重大差异。我可能会错过什么?

这是与Xcode 4.5,编译苹果llvm 4.1。

更新:我错过了线索是,错误只发生在一个.mm文件,.m文件都很好,所以在某种程度上基础枚举类型不会用C++工作(即使启用C + +11)。作为一种解决方法,我为该文件中使用的一个objective-git类放了一个假的最小@interface声明,所以我不必包含头文件,但是我仍然希望找到一个更清晰的解决方案。

+1

请注意,这依赖于Clang + ObjC特定的扩展:http://clang.llvm.org/docs/LanguageExtensions.html#enumerations-with-a-fixed-underlying-type – Potatoswatter 2013-02-27 15:52:41

回答

1

谷歌变成了this file包含此:

typedef enum { 
    GIT_RESET_SOFT = 1, /** Move the head to the given commit */ 
    GIT_RESET_MIXED = 2, /** SOFT plus reset index to the commit */ 
    GIT_RESET_HARD = 3, /** MIXED plus changes in working tree discarded */ 
} git_reset_t; 

这是一个旧式枚举与int作为基础类型。但它不是int,它是一种独特的类型。它不是整体,它不能成为新式枚举的基础类型。

的解决办法是使用typedef enum : int或者,如果你可以使用C++,并希望成为额外的说明文,

typedef enum : std::underlying_type<git_reset_t>::type 

我没有试过,但你也可以试试这个在ObjC没有C++:

typedef enum : __underlying_type(git_reset_t) 
+0

但是,如果它编译没有错误在objective-git项目中,必须有一个非代码解决方案。 – Uncommon 2013-02-27 15:42:35

+0

@Uncommon你确定他们使用完全相同的编译器版本吗?扩展的行为可能已经改变。这些东西的测试覆盖率可能很差,而且ObjC扩展可能会与C++标准功能相同。 – Potatoswatter 2013-02-27 15:54:54

+0

是的,我确定我使用与objective-git项目(Apple llvm 4.1)相同的编译器版本。 – Uncommon 2013-02-27 16:08:30