2013-02-27 91 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